DirectX11/OpenGL仅渲染一半纹理

DirectX11/OpenGL仅渲染一半纹理,opengl,textures,directx-11,directx-10,Opengl,Textures,Directx 11,Directx 10,应该是这样的。它使用与DX11和OpenGL相同的顶点/uv坐标。此场景是在DirectX10中渲染的 这就是它在DirectX11和OpenGL中的外观 我不知道这怎么会发生。我在DX10和DX11上面都使用了相同的代码,而且它们的处理方式也非常相似。你知道问题可能是什么以及如何解决吗? 如果需要,我可以发送代码 也使用另一种纹理 将纹理的透明部分更改为红色 片段着色器GLSL #version 330 core in vec2 UV; in vec3 Color; unifor

应该是这样的。它使用与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);
}
    #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

    #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);
}
    #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;

}

很快地说,看起来您使用的是背面剔除,这很好,而模型的另一面缠绕错误。通过禁用OpenGL:glDisableGL\u CULL\u face,可以确保这是一个问题​.


真正的修正是,如果这是正确缠绕面的问题,通常是逆时针方向。这取决于你从哪里得到这个模型。如果您自己生成,请在模型生成例程中更正绕组。通常,由三维建模软件创建的模型文件具有正确的面缠绕。

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


GLDrawerElements和其他东西将顶点数作为其大小参数,这一事实使这一点更加混乱。参数名为count,但它不是顶点计数,也不是多边形计数。您可以尝试以下几点:

是否启用深度测试?看起来“另一侧”多边形的内面正在靠近视点的多边形上渲染。如果禁用深度测试,则可能发生这种情况。启用它以防万一

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

我发现了错误

原因是我忘记将纹理采样器状态设置为“包裹/重复”。
它被设置为钳制,因此uv坐标被最大化为1。

hm无反转面剔除或改变缠绕顺序不会改变任何东西。gl_cull_face被禁用只是通过打开它来测试,它会产生一些相似但外观不同的结果这也是我的猜测,但如果是背面剔除问题,你会看到鸟的另一半旋转。这看起来只有一半的鸟被画出来了,但是画得很正确。我使用另一种纹理添加了另一张图片。黑色的一面是未正确渲染的一面。我还将纹理的透明部分更改为红色,您可以看到上面的结果。深度测试已启用,而照明未启用。这些白色闪烁不在场景中,这是因为gif.ok。从您发布的较新图像来看,法线已关闭。你介意粘贴一些代码吗?我确实有法线,但我还没有在任何地方使用它们,因为我还没有使用lightning。作为将来的参考,在编写GLSL 3.30 core着色器时,不要使用gl_FragColor或texture2D。。。;那些是不推荐的。许多GLSL编译器将允许您继续使用它们,但它们不是必需的。您应该使用用户定义的片段输出,例如out vec4 frag_颜色和纹理。。。这是一个重载函数,它接受从GLSL 1.30开始的所有采样器类型。