我正在尝试将 3D 纹理与 2D 纹理混合以制作地形。3D 纹理有苔藓、沙子、雪等,内插以增强高度的错觉。2D 纹理目前只有一条橙色线,表示“道路”。这是我的片段着色器:
# version 420
uniform sampler3D mainTexture;
uniform sampler2D roadTexture;
void main() {
vec4 diffuse3D = texture3D(mainTexture, gl_TexCoord[0].stp);
vec4 diffuse2D = texture2D(roadTexture, gl_TexCoord[1].st);
// Yes, I am aware I am only returning the 2D texture value
// However this is for testing purposes only
// Doing gl_FragColor = diffuse3D + diffuse2D;
// Or any other operation returns the 3D texture only
gl_FragColor = diffuse2D;
}
这是我的绘图电话:
void Terrain::Draw() {
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, sizeof(glm::vec3), &v[0].x);
glEnableClientState(GL_NORMAL_ARRAY);
glNormalPointer(GL_FLOAT, sizeof(glm::vec3), &n[0].x);
s.enable(); // simple glUseProgram call within my Shader object
glClientActiveTexture(GL_TEXTURE0);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnable(GL_TEXTURE_3D);
glBindTexture(GL_TEXTURE_3D, id_texture);
s.setSampler("mainTexture",0); // Calls to glGetUniformLocation and glUniform1i
glTexCoordPointer(3, GL_FLOAT, sizeof(glm::vec3), &t[0].x);
glClientActiveTexture(GL_TEXTURE1);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, id_texture_road);
s.setSampler("roadTexture",1); // Same as above
glTexCoordPointer(2, GL_FLOAT, sizeof(glm::vec2), &t2[0].x);
glPushMatrix();
glScalef(scalex,scaley,scalez);
glDrawElements(GL_TRIANGLES, sizei, GL_UNSIGNED_INT, index);
glPopMatrix();
s.disable(); // glUseProgram(0)
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_TEXTURE_3D);
glDisable(GL_TEXTURE_2D);
}
这是我的setSampler()
方法的代码:
void Shader::setSampler(std::string name, GLint value)
{
GLuint loc = glGetUniformLocation(program, name.c_str());
if (loc>0)
{
glUniform1i(loc, value);
}
}
结果是整个地形上的纯黑色。遗憾的是,我无法找到有关 sampler3D 的信息,但我的片段着色器中的diffuse3D 变量确实计算到了正确的纹理,并且我的2D 纹理的纹理坐标被正确地发送到片段着色器(我知道这一点是因为我使用了它们为测试的地形着色并获得从绿色到红色的平滑渐变,这是您仅使用前 2 个坐标所期望的)。我还检查了传递给我的setSampler()
方法的值,我确实得到了 0 和 1,以及对应于它们的 1 和 2 位置。
我在这个问题上能找到的所有帮助都围绕着这里提供的建议,我已经实施了)。
有人可以帮忙吗?
编辑:所以,只是为了踢球,我交换了我的纹理单元,所以 2D 纹理变成了单元 0,3D 变成了单元 1。现在只渲染了 2D 纹理。但是我的纹理单元被正确地(至少在外观上)传递给了着色器。有什么线索吗?