Opengl sampler2D和samplerCube在一个着色器中
我试图在一个着色器中使用Opengl sampler2D和samplerCube在一个着色器中,opengl,glsl,Opengl,Glsl,我试图在一个着色器中使用sampler2D和samplerCube。我过去常常使用struct对一些sampler2D执行此操作。但是现在我决定不再把它们放在结构中,并且注意到了几个特性。如果我将sampler2D放入struct,绑定samplerCube一次就足够了。但是,如果我将sampler2D放在结构外部,每次绘制每个模型时,我都必须绑定samplerCube。下面我给出伪代码的示例 sampler2D转换为struct: uniform samplerCube shadowMaps;
sampler2D
和samplerCube
。我过去常常使用struct
对一些sampler2D
执行此操作。但是现在我决定不再把它们放在结构中,并且注意到了几个特性。如果我将sampler2D
放入struct
,绑定samplerCube
一次就足够了。但是,如果我将sampler2D
放在结构外部,每次绘制每个模型时,我都必须绑定samplerCube
。下面我给出伪代码的示例
sampler2D
转换为struct
:
uniform samplerCube shadowMaps;
uniform struct Mapping {
sampler2D ambientMapping;
sampler2D diffuseMapping;
sampler2D specularMapping;
sampler2D normalMapping;
} mapping;
uniform samplerCube shadowMaps;
uniform sampler2D ambientMapping;
uniform sampler2D diffuseMapping;
uniform sampler2D specularMapping;
uniform sampler2D normalMapping;
C++伪代码:
// somewhere in init
// samplerCube
glUniform1i(shadow, 4);
glActiveTexture(GL_TEXTURE4);
glBindTexture(GL_TEXTURE_CUBE_MAP, shadowMapId);
// ...
// drawing models
for (size_t i = 0; i < MODELS_COUNT; i++) {
glUniform1i(model[i].ambientMapping, 0);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, model[i].texturesIds[0]);
glUniform1i(model[i].diffuseMapping, 1);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, model[i].texturesIds[1]);
// analogically for specular and normal
// model
}
// drawing models
for (size_t i = 0; i < MODELS_COUNT; i++) {
glUniform1i(model[i].ambientMapping, 0);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, model[i].texturesIds[0]);
glUniform1i(model[i].diffuseMapping, 1);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, model[i].texturesIds[1]);
// analogically for specular and normal
// samplerCube
glUniform1i(shadow, 4);
glActiveTexture(GL_TEXTURE4);
glBindTexture(GL_TEXTURE_CUBE_MAP, shadowMapId);
// model
}
C++伪代码:
// somewhere in init
// samplerCube
glUniform1i(shadow, 4);
glActiveTexture(GL_TEXTURE4);
glBindTexture(GL_TEXTURE_CUBE_MAP, shadowMapId);
// ...
// drawing models
for (size_t i = 0; i < MODELS_COUNT; i++) {
glUniform1i(model[i].ambientMapping, 0);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, model[i].texturesIds[0]);
glUniform1i(model[i].diffuseMapping, 1);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, model[i].texturesIds[1]);
// analogically for specular and normal
// model
}
// drawing models
for (size_t i = 0; i < MODELS_COUNT; i++) {
glUniform1i(model[i].ambientMapping, 0);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, model[i].texturesIds[0]);
glUniform1i(model[i].diffuseMapping, 1);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, model[i].texturesIds[1]);
// analogically for specular and normal
// samplerCube
glUniform1i(shadow, 4);
glActiveTexture(GL_TEXTURE4);
glBindTexture(GL_TEXTURE_CUBE_MAP, shadowMapId);
// model
}
//绘图模型
对于(大小i=0;i
为什么在第二种情况下,我每次都要做
glBindTexture(GL\u TEXTURE\u CUBE\u MAP,shadowMapId)
?最好的方法是什么?什么更有效率?所以您有“计数”samplerCube
和4sample2d
。但你似乎以相反的方式传递纹理单元。@Ripi2已编辑、删除COUNT