Java 矩阵在openGL中不起作用

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_

我试图创建一个正交矩阵,以及一个适当的模型和视图矩阵来查看一个简单的三角形,只是为了测试矩阵。我一直看到一个空白屏幕,我不知道发生了什么。我使用LWJGL,对于顶点和矩阵,我使用一个叫做JOML的库

主类(唯一类):

顶点着色器:

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和旧的GL
glBegin()/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;
}