Java 矩阵在openGL中不起作用
我试图创建一个正交矩阵,以及一个适当的模型和视图矩阵来查看一个简单的三角形,只是为了测试矩阵。我一直看到一个空白屏幕,我不知道发生了什么。我使用LWJGL,对于顶点和矩阵,我使用一个叫做JOML的库 主类(唯一类): 顶点着色器:Java 矩阵在openGL中不起作用,java,opengl,lwjgl,Java,Opengl,Lwjgl,我试图创建一个正交矩阵,以及一个适当的模型和视图矩阵来查看一个简单的三角形,只是为了测试矩阵。我一直看到一个空白屏幕,我不知道发生了什么。我使用LWJGL,对于顶点和矩阵,我使用一个叫做JOML的库 主类(唯一类): 顶点着色器: varying vec3 color; in vec4 position; uniform mat4 projection; uniform mat4 view; uniform mat4 model; void main() { color = gl_
varying vec3 color;
in vec4 position;
uniform mat4 projection;
uniform mat4 view;
uniform mat4 model;
void main() {
color = gl_Color.rgb;
gl_Position = projection * view * model * position;
}
片段着色器:
varying vec3 color;
void main() {
gl_FragColor = vec4(color, 1);
}
尝试将片段着色器更改为:
varying vec3 color;
out vec4 out_color;
void main() {
out_color = vec4(color, 1);
}
片段着色器应该在处理顶点着色器的输出后输出颜色。要使用
glUniformMatrix4fv
您需要首先调用glUseProgram
,或者在opengl 4.1及更高版本中,您可以使用glProgramUniformMatrix4fv
并将着色器程序传递给它
您还应该使用glGetProgramiv
检查着色器链接和验证错误。这可能是失败的
你的顶点也被裁剪掉了,getProjectionMatrix(0800,0600,-1,1).get(projectionFloat)代码>这里你说1代表“深度”,如果超过这个深度,它就不会被渲染。没关系,但这里:
glVertex3f(100,100,50);
glVertex3f(10040050);
glVertex3f(400,400,50)代码>
你超过50分了。如果你用大于50的值改变投影矩阵,你必须通过-50,因为这是“向前”的方向。否则它将“在你身后”
您应该真正使用顶点缓冲区,而不是旧的固定opengl管道。我认为您创建正交投影矩阵的函数不正确
我强烈建议阅读并理解这篇关于如何推导投影矩阵的文章:
作为奖励,这里有一个不同的实现,您可以适应您的个人类:
Matrix4 orthographic_matrix(float width, float height, float z_near, float z_far)
{
float x_right = width * 0.5f;
float x_left = width * -0.5f;
float y_top = height * 0.5f;
float y_bottom = height * -0.5f;
float one_delta_x = 1.0f / (x_right - x_left);
float one_delta_y = 1.0f / (y_top - y_bottom);
float one_delta_z = 1.0f / (z_far - z_near);
Matrix4 proj;
proj(0, 0) = 2.0f * one_delta_x;
proj(1, 1) = 2.0f * one_delta_y;
proj(2, 2) = -2.0f * one_delta_z;
proj(3, 0) = -1.0f * (x_right + x_left) * one_delta_x;
proj(3, 1) = -1.0f * (y_top + y_bottom) * one_delta_y;
proj(3, 2) = 1.0f * (z_far + z_near) * one_delta_z;
proj(3, 3) = 1.0f;
return proj;
}
glUniform*()
适用于当前程序。在这些调用之前,你需要调用glUseProgram()
。我不是opengl专家,但我从未见过有人将旧的opengl函数(如glBegin、glVertex、glEnd等)与现代opengl(如着色器)混合在一起。我认为要解决这个问题,您需要使用顶点缓冲区对象和glDrawArrays来实际使用着色器进行渲染。@jas您可以将GLSL和旧的GLglBegin()/glEnd()
,但在这种情况下,您不能使用core
配置文件,因为没有布局等等<代码>兼容性
配置文件是您的friend@JosephBarton另外,你应该把你的主课分成几个小班,因为现在任何人都很难阅读:)除非OP编辑了他的答案,做gl_FragColor=vec4(颜色,1)代码>正在做同样的事情。
Matrix4 orthographic_matrix(float width, float height, float z_near, float z_far)
{
float x_right = width * 0.5f;
float x_left = width * -0.5f;
float y_top = height * 0.5f;
float y_bottom = height * -0.5f;
float one_delta_x = 1.0f / (x_right - x_left);
float one_delta_y = 1.0f / (y_top - y_bottom);
float one_delta_z = 1.0f / (z_far - z_near);
Matrix4 proj;
proj(0, 0) = 2.0f * one_delta_x;
proj(1, 1) = 2.0f * one_delta_y;
proj(2, 2) = -2.0f * one_delta_z;
proj(3, 0) = -1.0f * (x_right + x_left) * one_delta_x;
proj(3, 1) = -1.0f * (y_top + y_bottom) * one_delta_y;
proj(3, 2) = 1.0f * (z_far + z_near) * one_delta_z;
proj(3, 3) = 1.0f;
return proj;
}