2017-05-14 1 views
1

2D 렌더링 용 OpenGL을 사용 중이며 실제 픽셀 좌표를 사용하고 싶습니다. 이것에 의해, 윈도우의 좌상에 (0, 0)을, 윈도우의 우하에 (폭, 높이)를 지정하고 싶습니다 (폭과 높이는 픽셀 단위의 윈도우의 크기입니다).). 그래서 사용하여 2D 직교 행렬을 얻을 내가 GLM에 대한 바인딩이없는 LWJGL을 사용하고OpenGL 2D 투영 행렬에 아무것도 표시되지 않습니다.

GL11.glViewport(0, 0, width, height); 
GL11.glDisable(GL11.GL_DEPTH_TEST); 
GL11.glMatrixMode(GL11.GL_PROJECTION); 
GL11.glOrtho(0f, width, height, 0f, -1f, 1f); 
GL11.glGetFloat(GL11.GL_PROJECTION_MATRIX, projectionBuffer); 
GL11.glLoadIdentity(); 

이렇게하려면 내가 버텍스 쉐이더에 glOrtho 생성하고 전달되는 투영 행렬을 사용하여 위의 OpenGL 호출. 투영 행렬을 재설정하여 나중에 그리기 호출에 영향을주지 않습니다. 이 후, projectionBuffer, FloatBufferglOrtho에 의해 생성 된 투영 행렬로 채워진다. 이 같은

프로젝션 매트릭스 생산 외모 (이 도움이 경우 나도 몰라) :

0.0015625 0.0 0.0 1.0 
0.0 -0.0027777778 0.0 -1.0 
0.0 0.0 -1.0 0.0 
0.0 0.0 0.0 1.0 

내 버텍스 쉐이더는 다음과 같습니다

#version 330 core 

layout (location = 0) in vec4 vertex; 

out vec2 TexCoords; 

uniform mat4 model; 
uniform mat4 projection = mat4(1.0); 

void main() 
{ 
    TexCoords = vertex.zw; 
    gl_Position = projection * model * vec4(vertex.x, vertex.y, 0.0, 1.0); 
} 

내가 쉐이더를 초기화, 나는 glUniformMatrix4을 사용하여 투영 행렬의 값을 설정합니다. glGetUniform을 사용하면 같은 투영 행렬을 반환하므로 성공적으로 완료됩니다.

모든 텍스쳐 쿼드를 그릴 때 모델 매트릭스가 생성됩니다. 각 쿼드는 동일한 VAO의 단일 VBO에 모두 저장되는 동일한 정점 및 uv를 공유합니다. 버텍스 데이터는 그려지는 각 쿼드와 각기 다른 모델 행렬이 적용되는 방식으로 공유됩니다. 모형 행렬은 실제 화면 좌표를 생성하기 위해 올바르게 계산됩니다. 예를 들어, 자사의 왼쪽 상단 광장 (0,0) 및 (128)의 너비/높이는 다음과 같은 모델 매트릭스를 생성 할 것이다 :이 모델 매트릭스가 셰이더에 전달됩니다

128.0 0.0 0.0 0.0 
0.0 128.0 0.0 0.0 
0.0 0.0 1.0 0.0 
0.0 0.0 0.0 1.0 

성공적으로 glUniformMatrix4를 사용하여 내가 확인했다 이.

vao = GL30.glGenVertexArrays(); 
int vbo = GL15.glGenBuffers(); 
GL30.glBindVertexArray(vao); 
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); 
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, QUAD_BUFFER, GL15.GL_STATIC_DRAW); 

GL20.glEnableVertexAttribArray(0); 
GL20.glVertexAttribPointer(0, 4, GL11.GL_FLOAT, false, 16, 0); 
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); 
GL30.glBindVertexArray(0); 

QUAD_BUFFER는 정점과 텍스처 좌표 데이터를 포함하는 float[]을 의미한다 :

쿼드의 버텍스 데이터를 공유 VAO을 초기화하기 위해, 나는 다음과 같은 코드를 사용합니다.

마지막으로, 질감 쿼드을 끌기 위해, 나는 다음과 같은 사용

shader.setMatrix4f("model", model);//Makes a call to glUniformMatrix4 - model is the model matrix as explained above. 
GL13.glActiveTexture(GL13.GL_TEXTURE0); 
texture.bind(); 
GL30.glBindVertexArray(vao); 
GL11.glDrawArrays(GL11.GL_TRIANGLES, 0, 6); 

내가 응용 프로그램을 실행할 때 문제는, 아무것도 창에 그려지지 않습니다되고; 그것은 완전히 검은 색으로 남아 있습니다. 셰이더를 사용하지 않을 때는 이전 방법 (glBegin 등)을 사용하여 셰이프를 그릴 수 있습니다. 나는 내가 뭘 잘못하고 있는지 알 수 없다.

답변

0

나는 자바 게임 포럼에서 누군가에게 큰 감사를 표하여이 문제를 해결할 수있었습니다. 그는 glOrtho를 호출하면 기존로드 된 행렬이 수정되어 glOrtho 호출을하기 전에 glLoadIdentity를 호출해야한다고 지적했습니다. 나는 어쨌든이 계산을 위해 glm의 java 포트를 사용하도록 전환했다.

관련 문제