2017-03-04 11 views
-3

나는 GL20.glUniformMatrix4fv()를 호출 할 때마다 쉐이더 프로그램에 의해 인식되지 않는다. 모든 쉐이더와 프로그램을 디버깅 한 후에 오류를 반환하지 않습니다.GLSL 120 버텍스 쉐이더는 쉐이더 프로그램보다 덜 활동적인 유니폼을 보여준다

큐브가 창에 그려집니다 (투영되지 않아 쿼드로 표시됨).

#version 120 
attribute vec3 position; 
uniform mat4 modelView; 
uniform mat4 proj; 
void main() 
{ 
    gl_Position = vec4(position, 1.0); // See how we directly give a vec3 to vec4's constructor 
} 

아무 것도 창으로 그려지지 않습니다 : 오류없이 컴파일 및 작동 쉐이더 프로그램입니다. 쉐이더 프로그램이 오류없이 컴파일하지만 아무것도 화면에 보여줍니다 :

#version 120 
attribute vec3 position; 
uniform mat4 modelView; 
uniform mat4 proj; 
void main() 
{ 
    gl_Position = proj * vec4(position, 1.0); // See how we directly give a vec3 to vec4's constructor 
} 

조각 쉐이더 :

#version 120 
void main() 
{ 
    gl_FragColor = vec4(0.0, 1.0, 1.0, 1.0); 
} 

프로그램 항상 링크 컴파일하지만 균일 한 PROJ 나던 작품.

균일 한 데이터가 전송되는 코드입니다 :

GL20.glUseProgram(shaderProgram); 
    int model = GL20.glGetAttribLocation(shaderProgram, "modelView");//used get attrib here instead of GL20.glGetUniformLocation(); 
    Matrix4f modelView = new Matrix4f().translate(.5f, .5f, .5f); 
    GL20.glUniformMatrix4fv(model, false, modelView.get(buffer)); 

    int proj = GL20.glGetAttribLocation(shaderProgram, "proj");//and here 
    Matrix4f projection = new Matrix4f(). 
          perspective((float)Math.toRadians(45), 1.0f, 0.1f, 100f). 
          lookAt(0.0f, 0.0f, -3.0f, //eye 
           0.0f, 0.0f, 0.0f, //center 
           0.0f, 1.0f, 0.0f);//up 
    GL20.glUniformMatrix4fv(proj, false, projection.get(buffer)); 

    //draw container 
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, VBO); 
    GL11.glDrawArrays(GL_TRIANGLES, 0, 36); 
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); 

아직 아무것도 화면에 그려지지 않습니다를 gluniformmatrix4fv을 호출하기 전에 gluseprogram을 넣어 {업데이트}. Identity matrix가 proj로 보내지면 vec4가 곱 해져 큐브가 사라집니다.

검사 : 버텍스 셰이더

GL20.glGetShaderiv(vertexID, GL20.GL_ACTIVE_UNIFORMS, success); 

검사 동안 제로 를 반환 셰이더 프로그램

GL20.glGetProgramiv(shaderID, GL20.GL_ACTIVE_UNIFORMS, success); 

가 PROJ 및 모델 뷰 메인 방법에 사용되는 경우에 1 개 또는 2 개의 반환한다.

[해결 된 문제] get uniform location 대신 get attrib location을 사용하고있었습니다.

+0

'projection.get'의 기능은 무엇입니까? [lwjgl Matrix4f] (http://legacy.lwjgl.org/javadoc/org/lwjgl/util/vector/Matrix4f.html) 클래스는이 함수를 제공하지 않습니다. – BDL

+0

LWJGL 버전 3은 모든 행렬 연산을 없앴습니다. JOML, Java OpenGL 수학 라이브러리를 사용하고 있습니다. 행렬에 get 메쏘드를 호출 할 때마다 그 행렬에 있던 것이 무엇이든지 반환하고 그것을 버퍼에 넣는다. 이것은 버퍼가 그 함수의 대부분을 위해 원하는 데이터 구조이다. –

+0

'buffer'는 16-float 버퍼입니까? 정말로 MVCE를 만들어야합니다. 그렇지 않으면 문제가 어디 있는지 추측 할 수 있습니다. – BDL

답변

0

유니폼은 프로그램 상태 당 OpenGL에서입니다. glUniform*() 함수는 모두 현재 활성 프로그램 객체 인 의 유니폼을 설정합니다. 그 바로 그 프로그램의 유니폼을 설정하기 전에 glUseProgram에 전화해야합니다.

+0

전후에 glUseProgram을 넣으려고했지만 그 결과는 변하지 않습니다. 획일적 인 mat4를 추가하고 main 메소드에서 그것을 곱하면 프로그램은 화면에 아무 것도 그리지 않습니다. 모든 것은 여전히 ​​오류없이 컴파일되고 링크됩니다. gl 유니폼 수를 확인할 때 glgetshaderiv 및 glgetprogramiv는 mat4가 기본 방법 일 때 1 또는 2를 반환합니다. 아무것도 정확하게 그려지지 않습니다. –

+0

유니폼을 세우는 것이 문제인 이유는 무엇입니까? – derhass

+0

설정 여부에 관계없이 실행이 변경되지만 행렬에 벡터를 곱하면 이전 화면의 내용이 사라집니다. 문제는 셰이더가 제복을 올바르게받지 못한다는 것입니다. 모든 것이 컴파일되기 때문에 벡터에 곱해질 때 mat4가 비어 있다고 가정합니다. –