我在OpenGL中创建了一个立方体贴图/天空盒。
这是我的片段着色器:
#version 150
out vec4 vFragColor;
uniform samplerCube uCubeMap;
in vec3 texCoords;
void main() {
vFragColor = texture( uCubeMap, texCoords );
}
这是我的主要cpp文件:
glActiveTexture(GL_TEXTURE0);
GLuint textureId;
glGenTextures(1, &textureId);
glBindTexture(GL_TEXTURE_CUBE_MAP, textureId);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
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);
六方面都要求这样做:
glTexImage2D(face, 0, (!srgb) || g_Gl2Compatible ? GL_RGB : GL_SRGB, width, height,
0, GL_RGB, GL_UNSIGNED_BYTE, &pixData[0]);
其中face是GL_TEXTURE_CUBE_MAP_POSITIVE_X,GL_TEXTURE_CUBE_MAP_POSITIVE_Y等,pixData是图像文件内容。
当我运行它时,我收到以下错误:
Exception caught: Uniform variable uCubeMap: used in the shader codes, but not supplied. Type = GL_SAMPLER_CUBE, Size = 1
我在哪里定义uCubeMap?它是由OpenGL隐式定义的(如果是的话,在哪里),还是我自己必须这样做?
谢谢!
答案 0 :(得分:1)
没有人要求你定义"变量;你已经在着色器中做到了。他们要求你做的是告诉OpenGL纹理来自哪个纹理图像单元。假设您在尝试渲染时将纹理绑定到GL_TEXTURE0
,则必须assign that uniform value to the texture image unit 0。
这可以通过在程序对象中设置uCubeMap
的统一值来实现。取样器是不透明的制服,因此它们由glProgramUniform1i
(或glUniform1i
)设置。您可以将此均匀设置为0,因为您将纹理绑定到纹理单元0。