OpenTK - 与ProjectionMatrix相乘后,再也没有渲染了

时间:2017-07-28 10:03:29

标签: opengl matrix glsl opentk

从拒绝解释它的教程我得到以下代码。这是一个我复制的lwjgl教程,它工作得很好。我不确定问题是否是由于OpenGl与java openGl不同而产生的,但由于它只是数学,我会对此感到惊讶:

private void createProjectionMatrix(int width, int height)
{
    float aspectRatio = width / height;
    float yScale = (float)((1f / Math.Tan(Maths.degreeToRadian(FOV/2f))) * aspectRatio);
    float xScale = yScale / aspectRatio;
    float frustumLength = FAR_PLANE - NEAR_PLANE;

    projectionMatrix = new Matrix4();
    projectionMatrix.M11 = xScale;
    projectionMatrix.M22 = yScale;
    projectionMatrix.M33 = -((FAR_PLANE + NEAR_PLANE) / frustumLength);
    projectionMatrix.M34 = -1;
    projectionMatrix.M43 = -((2 * NEAR_PLANE * FAR_PLANE) / frustumLength);
    projectionMatrix.M44 = 0;   
}

这个我乘以变换矩阵(有效)。我通过uniformLocation_projectionMatrix = GL.GetUniformLocation(programID, "projectionMatrix")然后GL.UniformMatrix4(uniformLocation_projectionMatrix, false, ref projectionMatrix)得到了着色器的矩阵,这样我也在那里得到了transformationMatrix,所以这不应该是问题。
在着色器中,我gl_Position = projectionMatrix * transformationMatrix * vec4(in_position, 1.0)(再次,没有projectionMatrix一切正常),在此之前uniform mat4 projectionMatrix;(因为你可以确认我拼写完全一样)。
我不确定您需要的代码的其他部分,所以请随意提问,谢谢 编辑1:我试过转置它(通过将false设置为true),resut是相同的

编辑2:
 由上面的代码创建的矩阵:
(1,428148; 0; 0; 0) ( 0; 2,53893; 0; 0) ( 0; 0; -1,002002; -1) ( 0; 0; -0,2002002; 0)

Matrix4.CreatePerspectiveFieldOfView()创建的矩阵:
(0,8033332; 0; 0; 0) ( 0; 1,428148; 0; 0) ( 0; 0; -1,002002; -1) ( 0; 0; -0,2002002; 0)
由Draykoon D的布局创建的矩阵答案:
(-0,00015625; 0; 0; 0) ( 0; 0,0002777778; 0; 0) ( 0; 0; -1,002002; -0,2002002) ( 0; 0; -1; 0)

我现在确信问题出在其他地方 - 所有三个基质都不起作用。

编辑3 - 更多代码: 到目前为止这是我的vertexShader

#version 440 core

layout (location = 0) in vec3 in_position;
layout (location = 1) in vec2 in_textureCoordinates;

uniform mat4 translation;
uniform mat4 rotationX;
uniform mat4 rotationY;
uniform mat4 rotationZ;
uniform mat4 scale;

uniform mat4 projectionMatrix;

out vec2 textureCoordinates;

void main(void)
{
    mat4 transformationMatrix = translation * rotationX * rotationY * rotationZ * scale;
    gl_Position = projectionMatrix * transformationMatrix * vec4(in_position,  1.0);
    textureCoordinates = in_textureCoordinates;
}

这是渲染功能:

public void render(Entity entity, ShaderProgram shader)
    {
        TexturedModel texturedModel = entity.Model;
        RawModel model = texturedModel.Model;
        GL.BindVertexArray(model.VaoID);
        GL.EnableVertexAttribArray(0);
        GL.EnableVertexAttribArray(1);
        shader.loadTransformationMatrix(
            entity.Position, entity.RotX, entity.RotY, entity.RotZ, entity.Scale);
        GL.ActiveTexture(TextureUnit.Texture0);
        GL.BindTexture(TextureTarget.Texture2D, texturedModel.Texture.ID);
        GL.DrawElements(BeginMode.Triangles, model.VertexCount, DrawElementsType.UnsignedInt, 0);
        GL.DisableVertexAttribArray(0);
        GL.DisableVertexAttribArray(1);
        GL.BindVertexArray(0);
    }    

并且Renderer的构造函数加载projectionMatrix:

public Renderer(int width, int height, ShaderProgram shader)
    {
        createProjectionMatrix(width, height);
        shader.loadProjectionMatrix(projectionMatrix);
    }

2 个答案:

答案 0 :(得分:0)

如果您想尝试构建此投影矩阵的其他方法,可以尝试使用数学explanation

enter image description here

不应该太难,

r和l代表左右,应该是-width / 2,width2

b和t代表底部和右侧, - 高度/ 2,高度/ 2

n和f代表近和远的飞机尝试不同的值,只需检查你的z属于间隔,祝你好运。我不确定,但看看这个计划,看看近处和远处飞机的标志。

答案 1 :(得分:0)

首先,在执行任何其他操作之前,请检查您是否在创建程序后直接调用GL.UseProgram(shaderProgram) ,以避免尝试加载投影矩阵等错误没有GL使用着色器 感谢大家的帮助,至少我学到了一些东西