opengl - 如何避免现代 GPU 上三角形之间出现黑线?

标签 opengl gpu opengl-3 pyopengl opengl-4

我正在构建一个带有 obj 导出功能的参数化 3D 建模器。

我真的很困惑。

我昨晚更换了 GPU,现在,顶点之间有裂缝,我可以看到后面的东西。我的旧卡是 Nvidia GTX275,另一张是 NVIDIA GTX960。 我没有更改代码、着色器或其他方面的任何内容。我只使用平面颜色(而不是纹理)。

在下图中,将五边形切割成三角形的黑线不应该出现。

enter image description here

这似乎纯粹是一个 OpenGL 问题,因为当我导出模型并在 Blender 中查看时,面是连续的并且没有重复的顶点。

着色器代码非常简单:

_VERTEX2 = """
#version 330
#extension GL_ARB_explicit_uniform_location : enable
layout(location = 0 ) in vec3 position;
layout(location = 1 ) in vec4 color;
layout(location = 2 ) in vec3 normal;

varying vec4 baseColor;
// uniform mat4 proj;
layout(location = 0) uniform mat4 view;
layout(location = 4) uniform mat4 proj;

varying vec3 fragVertexEc;

void main(void) {
    gl_Position = proj * view * vec4(position, 1.0);
    fragVertexEc = (view * vec4(position, 1.0)).xyz;
    baseColor = color;
}
"""


_FRAGMENT2 = """
#version 330
#extension GL_OES_standard_derivatives : enable

varying vec3 fragVertexEc;
varying vec4 baseColor;

const vec3 lightPosEc = vec3(0,0,10);
const vec3 lightColor = vec3(1.0,1.0,1.0);

void main()
{
    vec3 X = dFdx(fragVertexEc);
    vec3 Y = dFdy(fragVertexEc);
    vec3 normal=normalize(cross(X,Y));

    vec3 lightDirection = normalize(lightPosEc - fragVertexEc);

    float light = max(0.0, dot(lightDirection, normal));


    gl_FragColor = vec4(normal, 1.0);
    gl_FragColor = vec4(baseColor.xyz * light, baseColor.w);
}
"""

渲染代码也很简单:

def draw(self, view_transform, proj, transform):
    self.shader.use()
    gl_wrap.glBindVertexArray(self.vao)
    try:
        self.vbo.bind()

        view_transform = view_transform * transform
        GL.glUniformMatrix4fv(0, 1, False, (ctypes.c_float*16)(*view_transform.toList()))
        GL.glUniformMatrix4fv(4, 1, False, (ctypes.c_float*16)(*proj.toList()))

        GL.glEnableVertexAttribArray(self.shader.attrib['position'])
        GL.glEnableVertexAttribArray(self.shader.attrib['color'])
        GL.glEnableVertexAttribArray(self.shader.attrib['normal'])

        STRIDE = 40
        GL.glVertexAttribPointer(
            self.shader.attrib['position'], len(Vector._fields), GL.GL_FLOAT,
            False, STRIDE, self.vbo)

        GL.glVertexAttribPointer(
            self.shader.attrib['color'], len(Color._fields), GL.GL_FLOAT,
            False, STRIDE, self.vbo+12)

        GL.glVertexAttribPointer(
            self.shader.attrib['normal'], len(Vector._fields), GL.GL_FLOAT,
            False, STRIDE, self.vbo+28)

        GL.glDrawElements(
            GL.GL_TRIANGLES,
            len(self.glindices),
            self.index_type,
            self.glindices)

    finally:
        self.vbo.unbind()
        gl_wrap.glBindVertexArray(0)
        self.shader.unuse()

一个简单的四边形将以下数据发送到 OpenGL:

vertices ( flat array of pos+rgba+normal) :
[5.0, -3.061616997868383e-16, 5.0, 0.898, 0.0, 0.0, 1.0, 0.0, 1.0, 6.123233995736766e-17, 
-5.0, 3.061616997868383e-16, -5.0, 0.898, 0.0, 0.0, 1.0, 0.0, 1.0, 6.123233995736766e-17, 
-5.0, -3.061616997868383e-16, 5.0, 0.898, 0.0, 0.0, 1.0, 0.0, 1.0, 6.123233995736766e-17, 
5.0, 3.061616997868383e-16, -5.0, 0.898, 0.0, 0.0, 1.0, 0.0, 1.0, 6.123233995736766e-17]

indices  :: [0, 1, 2, 0, 3, 1]

最佳答案

好的,明白了!

奇怪的显示是由于 glEnabled(GL_POLYGON_SMOOTH) 造成的。

我完全忘记了它,因为我的旧卡对此设置没有做任何事情。至少是不可见的。 但新的具有正确的行为:它尝试独立地对每个三角形进行抗锯齿,从而产生黑线。

非常感谢@Jerem,他帮助我涵盖了其他可能性。

关于opengl - 如何避免现代 GPU 上三角形之间出现黑线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30522880/

相关文章:

c++ - 获取有关重新定义的错误(OpenGL 4.0 Shading Language Cookbook)

c - 如何在 OpenGL 中创建便宜的阴影?

f# - Microsoft Accelerator V2 - toArray2D 问题

cuda - CUDA Thrust 与原始内核相比如何?

c++ - 在 OpenGL 中生成网格

c++ - OpenGL VBO 和指针的问题

java - 重新创建数组后的 NPE

c++ - 如何在 DirectX 11 应用程序中提供选择图形适配器的选项?

c++ - OpenGL 3 如何放大 GL_TEXTURE RECTANGLE?