【发布时间】:2016-09-10 10:50:45
【问题描述】:
我不知道为什么我的模型在透视模式下渲染得很好,但在正交模式下却有问题。该模型由 2 个立方体组成,一个大的,一个小的顶部。在 Ortho 模式下,小立方体呈现在大立方体后面,尽管它不应该:
显然我做对了,因为大立方体完全正确渲染,即使在任何方向旋转时也是如此。也许与在正交模式下深度缓冲区是线性的事实有关? 我在正交模式下的 znear 和 zfar 值是 0.4 和 1000。启用了深度测试。模型(= 两个立方体)存储在具有 3 个 vbo(用于顶点、uvs 和 rgbas)的 VAO 中
使用此着色器渲染模型:
顶点:
#version 330
#extension GL_ARB_explicit_attrib_location: enable
layout(location = 0) in vec3 vertexPositionIn;
layout(location = 1) in vec2 uvIn;
layout(location = 2) in vec4 colorIn;
uniform mat4 projectionMatrix;
uniform mat4 modelViewMatrix;
out vec2 uv;
out vec4 color;
void main(void)
{
uv = uvIn;
color = colorIn;
gl_Position = projectionMatrix * modelViewMatrix * vec4(vertexPositionIn, 1.0);
}
片段:
#version 330
in vec2 uv;
in vec4 color;
uniform sampler2D itemTex;
void main () {
gl_FragColor = texture(itemTex, uv) * color;
}
正交模式设置
public void OrthoMode(int width, int height)
{
GlMatrixModeProjection();
GlPushMatrix();
GlLoadIdentity();
GlOrtho(0, width, height, 0, 0.4f, 1001);
LoadCurrentProjectionMatrix();
GlMatrixModeModelView();
GlPushMatrix();
GlLoadIdentity();
GlTranslate(0, 0, -500); // Translate far in the back so we can also render 3d stuff
LoadCurrentModelViewMatrix();
}
绘制调用:
[....]
game.GlPushMatrix();
game.GlTranslate((float)posX, (float)posY, (float)posZ);
DrawItemStack(modelref, size, rotate);
game.GlPopMatrix();
[....]
public void DrawItemStack(ModelRef modelref, float size, bool rotate = false)
{
game.GlPushMatrix();
game.GlTranslate(0.5f * size, 0.5f * size, 0.5f * size);
game.GlRotate(180f + 22.6f, 1, 0, 0); // In ortho mode our y-axis is flipped
game.GlRotate(-45.3f + (rotate ? game.CurrentTimeMilliseconds / 50f : 0), 0, 1, 0);
game.GlScale(size * 0.5f, size * 0.5f, size * 0.5f);
game.GlTranslate(-0.5f, -0.5f, -0.5f);
game.LoadCurrentProjectionMatrixUniform(0);
game.LoadCurrentModelviewMatrixUniform(1);
game.Platform.DrawModelNew(modelref); // Calls GL.DrawElements()
game.GlPopMatrix();
}
【问题讨论】:
-
请添加显示您的正交模式设置和深度设置的代码。
-
添加了正交模式设置(我自己做矩阵计算,所以不调用原生opengl矩阵方法)。深度设置只是一个简单的启用深度测试。
-
嗯。对我来说看起来很有趣。让我们试试别的。获取 gDEBugger/CodeXL 并分析两个立方体的深度。如果相等,你就有问题了。
-
感谢您的提示,看起来小立方体实际上位于大立方体的后面。我在这里使用 gDEBugger 对深度缓冲区进行了两个样本,小立方体的深度值较小:imgur.com/AVwQFae Hm 这太令人困惑了。
-
我仍然可以将绘制调用粘贴到我应用一些旋转的地方
标签: c# opengl 3d render orthographic