从拒绝解释它的教程我得到以下代码。这是一个我复制的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);
}
答案 0 :(得分:0)
如果您想尝试构建此投影矩阵的其他方法,可以尝试使用数学explanation
不应该太难,
r和l代表左右,应该是-width / 2,width2
b和t代表底部和右侧, - 高度/ 2,高度/ 2
n和f代表近和远的飞机尝试不同的值,只需检查你的z属于间隔,祝你好运。我不确定,但看看这个计划,看看近处和远处飞机的标志。答案 1 :(得分:0)
首先,在执行任何其他操作之前,请检查您是否在创建程序后直接调用GL.UseProgram(shaderProgram)
,以避免尝试加载投影矩阵等错误没有GL使用着色器
感谢大家的帮助,至少我学到了一些东西