【发布时间】:2016-11-12 16:51:06
【问题描述】:
我正在尝试在模型上使用 3 个纹理。我正在使用 SOIL 加载图像并将它们绑定到纹理单元 1、2 和 3。但由于某种原因,当我将采样器 1、2 和 3 绑定到我的着色器时,1 会生成绑定到 GL_TEXTURE2 的图像,而 2和 3 生成绑定到GL_TEXTURE3 的图像。我在这里遗漏了一些简单的东西吗?
定义:
GLenum baseTextureUnitID = GL_TEXTURE1;
GLenum filterTextureUnitID = GL_TEXTURE2;
GLenum accentTextureUnitID = GL_TEXTURE3;
GLuint baseTextureSamplerValue = 1;
GLuint filterTextureSamplerValue = 2;
GLuint accentTextureSamplerValue = 3;
加载图片:
baseTextureID = SOIL_load_OGL_texture(baseImageFile,
SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_INVERT_Y);
glActiveTexture(baseTextureUnitID);
glBindTexture(GL_TEXTURE_2D, baseTextureID);
filterTextureID = SOIL_load_OGL_texture(filterImageFile,
SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_INVERT_Y);
glActiveTexture(filterTextureUnitID);
glBindTexture(GL_TEXTURE_2D, filterTextureID);
accentTextureID = SOIL_load_OGL_texture(accentImageFile,
SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_INVERT_Y);
glActiveTexture(accentTextureUnitID);
glBindTexture(GL_TEXTURE_2D, accentTextureID);
获取统一的位置:
baseTextureSamplerID = glGetUniformLocation(shaderProgram, "baseTex");
filterTextureSamplerID = glGetUniformLocation(shaderProgram, "filterTex");
accentTextureSamplerID = glGetUniformLocation(shaderProgram, "accentTex");
设置制服:
glUniform1i(baseTextureSamplerID, baseTextureSamplerValue);
glUniform1i(filterTextureSamplerID, filterTextureSamplerValue);
glUniform1i(accentTextureSamplerID, accentTextureSamplerValue);
现在,如果我从 baseTex 中采样,我会得到过滤器图像,而 filterTex 和 AccentTex 采样器会产生重音图像
【问题讨论】:
-
你在
glUniform1i之前打电话给glUseProgram吗?同样在 OpenGL 4.4+ 中,在着色器中使用layout(binding=X)和在代码中使用glBindTextures函数要容易得多。 -
@ybungalobill 我使用的是 3.3,我应该指定。而且我没有先调用使用程序,切换它们并没有改变,我将获得一些屏幕截图示例。