着色器已链接但对某些人不起作用

2024-09-28 21:28:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我在C++和python编写了OpenGL程序,所有的计算机都得到了这个消息< /p>

vertex shader(s) linked fragment shader(s) linked

显示空白屏幕。所有其他可以看到图形的人都没有来自glgetprogramminfolog()的消息 我的笔记本显示了这条信息,但什么也看不到。一个具体的例子。我有Opengl 3.1我的一个朋友有3.2他看不到我一直能看到的东西。他明白了。这也发生在我的C++程序上。是否需要先验证程序?7个人中有3个人什么都看不见,他们都明白了。那些可以看到它的人不会从着色器得到一条消息。在

这是我的着色器上的所有东西。在

def init_shaders(self):
    vert_shader=glCreateShader(GL_VERTEX_SHADER)
    frag_shader=glCreateShader(GL_FRAGMENT_SHADER)

    vert_text="""
    varying vec2 texcoord;
    attribute vec3 inputvertex;
    uniform float ifintex;
    attribute vec2 input_texcoord;
    void main() {
        texcoord = (gl_MultiTexCoord0.xy*ifintex)+input_texcoord.xy;
        vec4 position = vec4(inputvertex,1.0);
        gl_Position = gl_ModelViewProjectionMatrix * position;
    }
    """

    frag_text="""
    uniform sampler2D texture_map;
    uniform vec4 add_color;

    varying vec2 texcoord;

    void main(){

        gl_FragColor = texture2D(texture_map, texcoord.xy)+add_color;

    }
    """

    glShaderSource(vert_shader,vert_text)
    glShaderSource(frag_shader,frag_text)

    glCompileShader(vert_shader)
    glCompileShader(frag_shader)

    self.Shader=glCreateProgram()
    glAttachShader(self.Shader,vert_shader)
    glAttachShader(self.Shader,frag_shader)
    glLinkProgram(self.Shader)
    error=glGetProgramInfoLog(self.Shader)
    if error!="":
        print error
    else:
        print "Shaders Compiled"

    glUseProgram(self.Shader)

有什么不对劲吗?我以为这只是一个通知,但这是一个太可疑的模式。在


Tags: textself程序消息erroruniformfragxy
2条回答

比OpenGL版本更重要的是驱动程序供应商。不同的驱动程序有不同的输出。因此,您的程序很可能与某些驱动程序(ATI、NVidia或Intel)不兼容。你应该找出你的程序在哪些显卡上工作,哪些卡失败了。在

据我所知,你的着色器看起来不错。此外,你永远不会从驱动程序得到任何错误或警告,除了信息消息。所以最有可能的疑点是mip-map纹理初始化,这在ATI上被认为是有缺陷的:http://www.opengl.org/wiki/Common_Mistakes#Automatic_mipmap_generation。在

您没有提供完整的程序代码。所以另一种可能是绑定到一个常量属性位置。视频卡驱动程序可以产生不同的属性位置映射,即使是在同一个系统上运行的两次。在

你的着色器没问题,问题出在别处。该错误很可能依赖于驱动程序供应商(ATI、NVidia或Intel)。在

通过将以下内容添加到着色器的顶部,尝试指定使用的是GLSL 1.20:

#version 120

其他任何东西可能只是实现之间的细微差别。我知道在Intel实现中,当没有纹理绑定时调用texture2D返回(0, 0, 0, 1),而NVIDIA和ATI实现则返回(0, 0, 0, 0)。在

除此之外,你的着色器看起来很好,试着在你朋友的计算机上乱搞它们,看看问题出在哪里。在

还可以询问你的朋友他们有什么GPU来查看哪些实现显示了错误。在

哦,你想用glGetProgramiv来检查GL_LINK_STATUS的值,而不是查看日志是否为空。有些实现在成功和失败时都会写入日志。GL_LINK_STATUS总是{}成功。在

相关问题 更多 >