多维数据集映射:在哪里创建发送到片段着色器的samplerCube?

时间:2016-12-16 01:38:45

标签: opengl

我在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隐式定义的(如果是的话,在哪里),还是我自己必须这样做?

谢谢!

1 个答案:

答案 0 :(得分:1)

没有人要求你定义"变量;你已经在着色器中做到了。他们要求你做的是告诉OpenGL纹理来自哪个纹理图像单元。假设您在尝试渲染时将纹理绑定到GL_TEXTURE0,则必须assign that uniform value to the texture image unit 0

这可以通过在程序对象中设置uCubeMap的统一值来实现。取样器是不透明的制服,因此它们由glProgramUniform1i(或glUniform1i)设置。您可以将此均匀设置为0,因为您将纹理绑定到纹理单元0。