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
, FloatBuffer
은 glOrtho
에 의해 생성 된 투영 행렬로 채워진다. 이 같은
프로젝션 매트릭스 생산 외모 (이 도움이 경우 나도 몰라) :
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[]
을 의미한다 :
마지막으로, 질감 쿼드을 끌기 위해, 나는 다음과 같은 사용
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
등)을 사용하여 셰이프를 그릴 수 있습니다. 나는 내가 뭘 잘못하고 있는지 알 수 없다.