나는 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을 사용하고있었습니다.
'projection.get'의 기능은 무엇입니까? [lwjgl Matrix4f] (http://legacy.lwjgl.org/javadoc/org/lwjgl/util/vector/Matrix4f.html) 클래스는이 함수를 제공하지 않습니다. – BDL
LWJGL 버전 3은 모든 행렬 연산을 없앴습니다. JOML, Java OpenGL 수학 라이브러리를 사용하고 있습니다. 행렬에 get 메쏘드를 호출 할 때마다 그 행렬에 있던 것이 무엇이든지 반환하고 그것을 버퍼에 넣는다. 이것은 버퍼가 그 함수의 대부분을 위해 원하는 데이터 구조이다. –
'buffer'는 16-float 버퍼입니까? 정말로 MVCE를 만들어야합니다. 그렇지 않으면 문제가 어디 있는지 추측 할 수 있습니다. – BDL