我用C ++和Python编写了OpenGL程序,以及所有收到此消息的计算机
vertex shader(s) linked fragment shader(s) linked
显示空白屏幕。所有其他可以看到图形的人都没有来自glGetProgramInfoLog()的消息 我的笔记本电脑显示该消息,看不到任何内容。一个具体的例子。我有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)
有什么不对吗?我认为这只是一个通知,但它太可疑了。
答案 0 :(得分:2)
尝试通过将其添加到着色器的顶部来指定您正在使用GLSL 1.20:
#version 120
其他任何可能是实现之间的细微差别。我知道在没有绑定纹理时调用texture2D
的英特尔实现返回(0, 0, 0, 1)
,而NVIDIA和ATI实现返回(0, 0, 0, 0)
。
除了你的着色器看起来很好,试着在朋友的机器上弄乱他们,看看问题出在哪里。
还要问你的朋友他们有什么GPU可以看到哪些实现显示错误。
哦,您希望使用GL_LINK_STATUS
检查glGetProgramiv
的值,而不是查看日志是否为空。有些实现会在成功和失败时写入日志。 <{1}}成功时总是GL_LINK_STATUS
。
答案 1 :(得分:1)
比OpenGL版本更重要的是驱动程序供应商。不同的驱动器有不同的输出因此,您的程序很可能与某些驱动程序(ATI,NVidia或Intel)不兼容。您应该找出您的程序使用的视频卡以及它失败的视频卡。
据我所知,你的着色器看起来很好。此外,除了信息消息之外,您永远不会从驱动程序中收到任何错误或警告。因此,最可能的嫌疑是mip-map纹理初始化,已知在ATI上有错误:http://www.opengl.org/wiki/Common_Mistakes#Automatic_mipmap_generation。
您尚未提供完整的程序代码。所以另一种可能性是你绑定到一个常量属性位置。即使在同一系统上运行,视频卡驱动程序也可以生成不同的属性位置映射。
TLDR:你的着色器很好,问题出在其他地方。该错误最有可能是驱动程序供应商(ATI,NVidia或Intel)。