【发布时间】:2021-01-25 04:17:51
【问题描述】:
我正在尝试渲染具有木质纹理的立方体(立方体的所有面都具有相同的纹理),但纹理没有按应有的方式渲染(看起来纹理在某些部分是透明的):
但是如果查看立方体内部,它似乎正在正确渲染:
这是我正在读取的 .obj 文件(带有纹理坐标和顶点):
mtllib crate.mtl
o Cube_Cube.002
v -1.000000 -1.000000 1.000000
v -1.000000 -1.000000 -1.000000
v 1.000000 -1.000000 -1.000000
v 1.000000 -1.000000 1.000000
v -1.000000 1.000000 1.000000
v -1.000000 1.000000 -1.000000
v 1.000000 1.000000 -1.000000
v 1.000000 1.000000 1.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vn -1.0000 0.0000 0.0000
vn 0.0000 0.0000 -1.0000
vn 1.0000 0.0000 0.0000
vn 0.0000 0.0000 1.0000
vn 0.0000 -1.0000 0.0000
vn 0.0000 1.0000 0.0000
usemtl Material
s off
f 6/1/1 1/2/1 5/3/1
f 7/4/2 2/5/2 6/6/2
f 8/7/3 3/8/3 7/9/3
f 5/10/4 4/11/4 8/12/4
f 2/13/5 4/11/5 1/14/5
f 7/4/6 5/15/6 8/12/6
f 6/1/1 2/16/1 1/2/1
f 7/4/2 3/17/2 2/5/2
f 8/7/3 4/18/3 3/8/3
f 5/10/4 1/19/4 4/11/4
f 2/13/5 3/17/5 4/11/5
f 7/4/6 6/20/6 5/15/6
这是我将纹理加载到 OpenGL 的方式:
unsigned char* localBuffer = stbi_load(filepath.c_str(), &this->width, &this->height, &this->bitsPerPixel, 4);
glGenTextures(1, &this->id);
glActiveTexture(GL_TEXTURE0 + this->slot);
glBindTexture(GL_TEXTURE_2D, this->id);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, this->width, this->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, localBuffer);
glBindTexture(GL_TEXTURE_2D, 0);
这是顶点着色器:
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec2 textureCoords;
out vec2 vTextureCoords;
uniform mat4 Mvp;
void main()
{
vTextureCoords = textureCoords;
gl_Position = Mvp * vec4(aPos, 1.0);
}
这是片段着色器:
out vec4 FragColor;
in vec2 vTextureCoords;
uniform sampler2D textureSlot;
void main()
{
FragColor = texture(textureSlot, vTextureCoords);
}
谁能告诉我我在这里做错了什么?
【问题讨论】:
-
看起来你的立方体的右侧三角形没有渲染。从内部看,立方体的正面和右侧如何?
-
@Sync it 从立方体内部看,所有边看起来都很正常。从我(从外面)看立方体的任何位置/角度似乎都会出现这种“透明效果”
-
是否启用了深度测试?我不认为你的纹理是问题
-
@Sync it 不,它没有启用。这就是问题所在。谢谢你的帮助:)
-
发布您的答案,以便我们关闭它