2014-11-13 2 views
0

저는 현재 일부 OpenGL을 배우고 있으며 큐브에 2 가지 다른 텍스처 (확산 및 반사)를 적용하려고합니다. 문제는 텍스처 유닛 0의 첫 번째 텍스처 만 접근 할 수 있다는 것입니다. 두 샘플러는 두 개의 다른 샘플러를 사용하지 않고 그것을 사용하는 것 같습니다.
LWJGL 멀티 텍스처가 작동하지 않습니다.

두 샘플러 유니폼을 모두 1로 지정하더라도 첫 번째 (확산 텍스처)가 사용됩니다. 나는 뭔가를 간과 한 것 같아요.

init()의 관련 부분은 다음과 같습니다

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

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

texture, textureSpecular, shaderProgramvaoID 글로벌 있습니다 : 다음과 같이

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() 방법의 관련 부분이 보인다 변수. 프래그먼트 쉐이더에서 선언 유니폼 : 내가 잘못합니까 무엇

uniform sampler2D materialDiffuseTexture; 
uniform sampler2D materialSpecularTexture; 

?

답변

1

오 세상에, 나는 지금 매우 어리 석다. 문제는 glUniform1f(int, float)이라는 ShaderProgram 클래스의 setUniform(String, float...) 메서드를 사용하고 있다는 것이 었습니다.

그러나 유니폼을 sampler2D 유니폼이 보유하고 있으므로 텍스쳐 유닛을 할당하려면 glUniform1i(int, int)을 사용해야합니다. 이제 작동합니다!

+1

우리 모두에게 발생합니다. 2 일 전이 주제에 대한 튜토리얼을 올린 Youtube Channel "ThinMatrix"를 확인해보십시오. – Joehot200

+0

감사합니다. 나는 그것을 조사 할 것이다. – tobs

관련 문제