DirectX11 / OpenGL只渲染一半纹理

时间:2014-12-21 14:26:11

标签: opengl textures directx-11 directx-10

enter image description here

它应该是这样的。它使用与DX11和OpenGL相同的顶点/ uv坐标。此场景在DirectX10中呈现。

enter image description here

这就是DirectX11和OpenGL的样子。

我不知道这是怎么发生的。我在DX10和DX11上都使用相同的代码,并且它们都处理非常类似的东西。你有一个想法可能是什么问题以及如何解决它? 如果需要,我可以发送代码。

enter image description here 也使用另一种纹理。

enter image description here 将纹理的透明部分更改为红色。

片段着色器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);
}

Vertex Shader 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;

}

4 个答案:

答案 0 :(得分:1)

很快就说,看起来你正在使用背面剔除(这很好),而你的模型的另一面是错误的啰嗦。您可以通过关闭面部剔除来确保这是问题(OpenGL:glDisable(GL_CULL_FACE))。

真正的校正是(如果这是问题)要正确缠绕面,通常是逆时针。这取决于您获得此模型的位置。如果您自己生成它,请在模型生成例程中正确缠绕。通常,由3D建模软件创建的模型文件具有正确的面部缠绕。

答案 1 :(得分:0)

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

glDrawElements()和其他东西将顶点的数量作为它们的大小参数,这使得更加困惑。该参数名为count,但它的顶点数并不明显,而不是多边形数。

答案 2 :(得分:0)

我发现了错误。

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

答案 3 :(得分:-1)

您可以尝试一些事项:

  1. 启用深度测试?看来你的内部面是来自“其他”的多边形。在靠近视点的多边形上渲染边。如果禁用深度测试,则可能发生这种情况启用它以防万一。

  2. 启用了照明?如果是这样,请将其关闭。一些白色闪光似乎进入旋转图像。可能是因为错误的法线 ...

  3. HTH