LWJGL多纹理不起作用

时间:2014-11-13 16:55:12

标签: java opengl textures lwjgl multitexturing

我正在学习一些OpenGL,我希望将2种不同的纹理(漫反射和镜面反射)应用于立方体。问题是只有第一个纹理(纹理单元0)可以访问;两个采样器似乎都使用它,而不是使用两个不同的。(

即使我将两个采样器制服分配给1,也会使用第一个(漫反射纹理)。我认为我一定忽略了一些东西。

init()的相关部分如下所示:

texture = Texture.loadTextureFromFile("res/texture/stone_07_diffuse.jpg");
textureSpecular = Texture.loadTextureFromFile("res/texture/stone_07_specular.jpg");

shaderProgram = new ShaderProgram();
shaderProgram.attachVertexShader("res/shader/LightTest.vsh");
shaderProgram.attachFragmentShader("res/shader/LightTest.fsh");
shaderProgram.link()

ShaderProgram.bind(shaderProgram);
{
    shaderProgram.setUniform("materialDiffuseTexture", 0);
    shaderProgram.setUniform("materialSpecularTexture", 1);
    ...
}
ShaderProgram.unbind();

Texture.setActiveTextureUnit(0);
Texture.bind(texture);

Texture.setActiveTextureUnit(1);
Texture.bind(textureSpecular);

render()方法的相关部分如下所示:

ShaderProgram.bind(shaderProgram);
{
    //set other uniforms as projectionMatrix, viewMatrix, etc.
    ...

    glBindVertexArray(vaoID);
    glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_BYTE, 0);
    glBindVertexArray(0);
}
ShaderProgram.unbind();

texturetextureSpecularshaderProgramvaoID是全局变量。 片段着色器中声明的制服:

uniform sampler2D materialDiffuseTexture;
uniform sampler2D materialSpecularTexture;

我做错了什么?

1 个答案:

答案 0 :(得分:1)

天啊,我现在感觉很蠢。问题是我使用setUniform(String, float...)类的ShaderProgram方法调用了glUniform1f(int, float)

但由于sampler2D制服持有一个整数,我必须使用glUniform1i(int, int)来指定纹理单元。现在它有效!