【问题标题】:DirectX11 / OpenGL only renders half of the textureDirectX11 / OpenGL 只渲染一半的纹理
【发布时间】:2014-12-21 14:26:11
【问题描述】:

这就是它应该的样子。它使用与 DX11 和 OpenGL 相同的顶点/uv 坐标。这个场景是在 DirectX10 中渲染的。

这就是它在 DirectX11 和 OpenGL 中的样子。

我不知道这怎么会发生。我在 DX10 和 DX11 上使用相同的代码,而且它们都处理非常相似的事情。您是否知道问题可能是什么以及如何解决? 如果需要,我可以发送代码。

也使用另一种纹理。

将纹理的透明部分更改为红色。

片段着色器 GLSL

    #version 330 core

in vec2 UV;
in vec3 Color;
uniform sampler2D Diffuse;


void main()
{

    //color = texture2D( Diffuse, UV ).rgb;
    gl_FragColor = texture2D( Diffuse, UV );
    //gl_FragColor = vec4(Color,1);
}

顶点着色器 GLSL

    #version 330 core

 layout(location = 0) in vec3 vertexPosition;
 layout(location = 1) in vec2 vertexUV;
 layout(location = 2) in vec3 vertexColor;
 layout(location = 3) in vec3 vertexNormal;

uniform mat4 Projection;
uniform mat4 View;
uniform mat4 World;

out vec2 UV;
out vec3 Color;

void main()
{

    mat4 MVP = Projection * View * World;
    gl_Position = MVP * vec4(vertexPosition,1);

    UV = vertexUV;

    Color = vertexColor;

}

【问题讨论】:

  • 为了以后参考,写GLSL 3.30核心着色器时,不要使用gl_FragColortexture2D (...);那些已被弃用。很多 GLSL 编译器会让你继续使用它们,但它们不是必须的。您应该使用用户定义的片段输出(例如out vec4 frag_color)和texture (...)(这是一个重载函数,它采用从 GLSL 1.30 开始的所有采样器类型)。

标签: opengl textures directx-11 directx-10


【解决方案1】:

快速地说,看起来您正在使用背面剔除(这很好),而您的模型的另一面被错误缠绕。您可以通过关闭背面剔除来确保这是问题所在 (OpenGL: glDisable(GL_CULL_FACE​))。

真正的修正是(如果这是问题的话)有正确的面缠绕,通常是逆时针。这取决于你从哪里得到这个模型。如果您自己生成它,请在模型生成例程中正确缠绕。通常,3D建模软件创建的模型文件具有正确的面缠绕。

【讨论】:

  • hm 没有回头面剔除或更改缠绕顺序不会改变任何东西。 gl_cull_face 被禁用(只是通过打开它来测试它,它会产生一些相似但看起来不同的结果)
  • 这也是我的猜测,但如果是背面剔除问题,您会看到鸟的另一半旋转。这看起来只有一半的鸟被绘制出来了,但绘制正确。
【解决方案2】:

这只是一个猜测,但您是在告诉系统要绘制的正确多边形数量吗?像glBufferData() 这样的调用获取数据的字节大小,而不是顶点或多边形的数量。 (也许他们应该将参数命名为numBytes 而不是size?)此外,大小必须包含所有数据的大小。如果颜色、法线、纹理坐标和顶点全部交错,则需要包括所有这些的大小。

glDrawElements() 和其他东西将顶点数作为其大小参数这一事实使这更加令人困惑。该参数被命名为count,但它不是很明显是顶点数,而不是多边形数。

【讨论】:

  • 它们被渲染了。我使用另一种纹理添加了另一张图片。黑色的一面是未正确渲染的一面。我还把纹理的透明部分改成了红色,你可以看到上面的结果。
【解决方案3】:

我发现了错误。

原因是我忘记将 Texture SamplerState 设置为 Wrap/Repeat。 它被设置为钳位,因此 uv 坐标最大为 1。

【讨论】:

    【解决方案4】:

    您可以尝试一些事情:

    1. 是否启用深度测试?似乎从“另一侧”开始的多边形的内面被渲染在更接近视点的多边形上。如果禁用深度测试,可能会发生这种情况。启用它以防万一。

    2. 是否启用照明?如果是这样,请将其关闭。旋转的图像中似乎出现了一些白色的闪光。可能是因为法线不正确 ...

    HTH

    【讨论】:

    • 深度测试已启用,但未启用照明。那些白色的闪光不在场景中,这是因为 gif。
    • 好的。看起来(从您发布的较新图像中)法线已关闭。你介意粘贴一些代码吗?
    • 我确实有法线,但我还没有在任何地方使用它们,因为我还没到使用闪电的地步。
    猜你喜欢
    • 2013-12-27
    • 2014-08-09
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-02
    • 2012-06-03
    相关资源
    最近更新 更多