sách gpt4 ai đã đi

opengl - OpenGL 中的立方体映射

In lại 作者:行者123 更新时间:2023-12-04 15:12:22 28 4
mua khóa gpt4 Nike

我尝试用 6 个位图映射立方体以实现天空盒效果。我的问题是一个纹理映射到立方体的每个面。我已经检查了 gwindow,在立方体纹理内存中我只有一个
图像(因为我尝试加载六个图像)。

代码准备纹理:

bool Texture::LoadCubicTexture(vector filenameTable)
{
glGenTextures(1,&texID);
glBindTexture(GL_TEXTURE_CUBE_MAP,texID);

glTexParameteri(GL_TEXTURE_CUBE_MAP,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP,GL_TEXTURE_WRAP_R,GL_CLAMP_TO_EDGE);

int i = 0;
vector::iterator vsit;

// There is always six filenames
for(vsit=filenameTable.begin();vsit!=filenameTable.end();++vsit)
{
string filename = *vsit;
BMPData* bmpData = LoadTextureBMPData_custom(filename);
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X+i,0,GL_RGB,bmpData->width,bmpData->height,0,GL_BGR,GL_UNSIGNED_BYTE,&(bmpData->data[0]));
i++;
delete daneObrazu;
}
glGenerateMipmap(GL_TEXTURE_CUBE_MAP);

trả về giá trị đúng;
}

对比:
#version 330 core

in vec3 vVertexPos;
in vec3 vertexUV;

out vec3 vCoords;
uniform mat4 MVP;

void main()
{
vCoords = normalize(vertexUV);
gl_Position = MVP * vec4(vVertexPos,1.0);
}

金融服务:
#version 330 core

in vec3 vCoords;
uniform samplerCube cube;

out vec4 vFragColor;

void main()
{
vFragColor = texture(cube, vCoords);
}

OBJ文件:
# Blender v2.62 (sub 0) OBJ File: 'skybox.blend'
# www.blender.org
mtllib skybox.mtl
o Cube
v 10.487665 -10.487666 -10.487665
v 10.487665 -10.487666 10.487665
v -10.487667 -10.487666 10.487664
v -10.487662 -10.487666 -10.487670
v 10.487671 10.487666 -10.487660
v 10.487659 10.487666 10.487673
v -10.487670 10.487666 10.487662
v -10.487665 10.487666 -10.487666
vt 0.990480 0.014286
vt 0.993478 0.991259
vt 0.016505 0.994256
vt 0.013507 0.017283
vt 0.988479 0.008111
vt 0.985457 0.993412
vt 0.000157 0.990390
vt 0.003179 0.005089
vt 0.002693 1.001082
vt -0.000347 0.009939
vt 0.990796 0.006898
vt 0.993837 0.998041
vt 0.004581 0.999210
vt 0.001535 0.006444
vt 0.994302 0.003398
vt 0.997347 0.996165
vt 0.004172 -0.000587
vt 0.996320 -0.003630
vt 0.999364 0.988517
vt 0.007216 0.991561
vt 0.000632 0.000140
vt 0.983846 -0.002921
vt 0.986862 0.995017
vt 0.003648 0.998078
vn 0.000000 -1.000000 0.000000
vn 0.000000 1.000000 0.000000
vn 1.000000 0.000000 0.000000
vn -0.000000 -0.000000 1.000000
vn -1.000000 -0.000000 -0.000000
vn 0.000000 0.000000 -1.000000
usemtl Skybox
s off
f 1/1/1 2/2/1 3/3/1
f 1/1/1 3/3/1 4/4/1
f 5/5/2 8/6/2 7/7/2
f 5/5/2 7/7/2 6/8/2
f 1/9/3 5/10/3 6/11/3
f 1/9/3 6/11/3 2/12/3
f 2/13/4 6/14/4 7/15/4
f 2/13/4 7/15/4 3/16/4
f 3/17/5 7/18/5 8/19/5
f 3/17/5 8/19/5 4/20/5
f 5/21/6 1/22/6 4/23/6
f 5/21/6 4/23/6 8/24/6

Câu hỏi của tôi:
  • 我在这段代码中使用的技术看起来没问题吗?
  • 纹理如何映射到立方体(在 GL_TEXTURE_CUBE_MAP 纹理中),
    什么时候只有2个紫外线? (我的意思是一般。)
  • 在这种情况下,我可以使用自动生成 UV 吗(我有吗?
    对着色器进行许多更改)?
  • 有人可以建议我在哪里可以搜索问题吗? (和一些
    可能性;缓冲区、着色器、网格;仅建议)?

  • [编辑]:
    我试图在单独的源文件中对顶点和 uv 进行硬编码,但我遇到了同样的问题——立方体的所有面都有一个纹理。硬编码数据似乎是正确的:
    #include "TestCube.h"

    vector GetTestCubeVertices()
    {
    vector vrtx;

    const float xd = 1.0f;
    const float yd = 1.0f;
    const float zd = 1.0f;

    const float testCubeVertices[] =
    {
    -xd, -yd, zd, xd, -yd, zd, -xd, yd, zd, // ABE
    xd, -yd, zd, -xd, yd, zd, xd, yd, zd, // BEF
    xd, -yd, zd, xd, -yd, -zd, xd, yd, zd, // BCF
    xd, -yd, -zd, xd, yd, zd, xd, yd, -zd, // CFG
    xd, -yd, -zd, -xd, -yd, -zd, xd, yd, -zd, // CDG
    -xd, -yd, -zd, xd, yd, -zd, -xd, yd, -zd, // DGH
    -xd, -yd, -zd, -xd, -yd, zd, -xd, yd, -zd, // DAH
    -xd, -yd, zd, -xd, yd, -zd, -xd, yd, zd, // AHE
    -xd, yd, zd, xd, yd, zd, -xd, yd, -zd, // EFH
    xd, yd, zd, -xd, yd, -zd, xd, yd, -zd, // FHG
    xd, -yd, zd, -xd, -yd, zd, xd, -yd, -zd, // BAC
    -xd, -yd, zd, xd, -yd, -zd, -xd, -yd, -zd, // ACD
    };

    for(int i=0;i<108;i=i+3)
    vrtx.push_back(vec3(testCubeVertices[i],testCubeVertices[i+1],testCubeVertices[i+2]));

    return vrtx;
    }

    vector GetTestCubeUVs()
    {
    vector uv;

    const float testCubeUV[] =
    {
    0,0, 1,0, 0,1, // ABE
    1,0, 0,1, 1,1, // BEF
    0,0, 1,0, 0,1, // BCF
    1,0, 0,1, 1,1, // CFG
    0,0, 1,0, 0,1, // CDG
    1,0, 0,1, 1,1, // DGH
    0,0, 1,0, 0,1, // DAH
    1,0, 0,1, 1,1, // AHE
    0,0, 1,0, 0,1, // EFH
    1,0, 0,1, 1,1, // FHG
    0,0, 1,0, 0,1, // BAC
    1,0, 0,1, 1,1, // ACD
    };

    for(int i=0;i<72;i=i+2)
    uv.push_back(vec2(testCubeUV[i],testCubeUV[i+1]));

    return uv;
    }

    还有两个补充问题,我有 OpenGL 电话:
    glTexParameteri(GL_TEXTURE_CUBE_MAP,GL_TEXTURE_WRAP_R,GL_CLAMP_TO_EDGE);
  • 我知道 OpenGL 处理 r 自动协调,因为
    具有常量 GL_TEXTURE_CUBE_MAP_POSITIVE_X 中的信息
    glTexImage2D()?
  • 是否需要修改? r 顶点着色器中的坐标?

  • 下面是结果屏幕(禁用写入深度缓冲区并且没有设置缩放,但现在不是我的问题):

    nhập mô tả hình ảnh ở đây

    我注意到重复的纹理是第五个加载的纹理(GL_TEXTURE_CUBE_MAP_POSITIVE_Z)。

    nhập mô tả hình ảnh ở đây

    [最后编辑]:
    Skybox VS中的UV坐标有问题( r 坐标只有一个值),Skybox VS应该是,如下:
    void main()
    {
    vCoords = normalize(vVertexPos);
    gl_Position = MVP * vec4(vVertexPos,1.0);
    }

    Skybox 技术存在一些问题,但它们不是本主题的主题。解决了。

    1 Câu trả lời

    纹理立方体贴图使用 3D 纹理坐标进行映射:它用于确定实际选择了哪个面立方体,然后导出用于访问立方体贴图面纹理的实际 2D 纹理坐标。

    您的纹理坐标是 2D(错误的),实际上您的纹理坐标 vertexUV (因此 vCoords )Z 坐标始终为 0,不明确地映射纹理(缺少的组件由默认属性值复制,即 vec4(0,0,0,1))。

    要获得想要的结果,请修改顶点着色器以使用有意义的坐标:

    vCoords = normalize(vVertexPos);

    关于opengl - OpenGL 中的立方体映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17895403/

    28 4 0
    Bài viết được đề xuất: spring - 非 Spring 管理类中 DI 的编译时间编织
    Bài viết được đề xuất: swig - 在 SWIG 接口(interface)中忽略 __attribute__((packed)) 是否总是安全的?
    Bài viết được đề xuất: Django 验证错误
    Bài viết được đề xuất: 适用于 Windows/Linux 的 MONO 3.2 - 缺少?
    行者123
    Hồ sơ cá nhân

    Tôi là một lập trình viên xuất sắc, rất giỏi!

    Nhận phiếu giảm giá Didi Taxi miễn phí
    Mã giảm giá Didi Taxi
    Giấy chứng nhận ICP Bắc Kinh số 000000
    Hợp tác quảng cáo: 1813099741@qq.com 6ren.com