【问题标题】:Problems rendering a 3d model on a 2d gui在 2d gui 上渲染 3d 模型的问题
【发布时间】: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();
}

最后,他是一个动画 gif,它在旋转时的行为方式:

【问题讨论】:

  • 请添加显示您的正交模式设置和深度设置的代码。
  • 添加了正交模式设置(我自己做矩阵计算,所以不调用原生opengl矩阵方法)。深度设置只是一个简单的启用深度测试。
  • 嗯。对我来说看起来很有趣。让我们试试别的。获取 gDEBugger/CodeXL 并分析两个立方体的深度。如果相等,你就有问题了。
  • 感谢您的提示,看起来小立方体实际上位于大立方体的后面。我在这里使用 gDEBugger 对深度缓冲区进行了两个样本,小立方体的深度值较小:imgur.com/AVwQFae Hm 这太令人困惑了。
  • 我仍然可以将绘制调用粘贴到我应用一些旋转的地方

标签: c# opengl 3d render orthographic


【解决方案1】:

原来这只是一个愚蠢的错误 - 我忘了启用深度遮罩 -.-

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    • 2023-02-06
    相关资源
    最近更新 更多