Loï*_*oix 0 opengl scheme glsl
我不太确定这个问题出现了什么,我从来没有太多关于着色器的经验所以它可能与实际的着色器无关(很可能问题不在着色器中)
我有这个结果

片段着色器
#version 120
void main(void) {
gl_FragColor[0] = 0.0;
gl_FragColor[1] = 0.0;
gl_FragColor[2] = 0.0;
}
Run Code Online (Sandbox Code Playgroud)
顶点着色器
#version 120
attribute vec2 coord2d;
void main(void) {
gl_Position = vec4(coord2d, 0.0, 1.0);
}
Run Code Online (Sandbox Code Playgroud)
我的渲染功能
(define (renderFunc)
(gl:Clear gl:COLOR_BUFFER_BIT)
(gl:UseProgram program)
(gl:EnableVertexAttribArray attribute_coord2d)
(gl:Begin gl:TRIANGLES)
(gl:Vertex3f 0.0 0.8 0)
(gl:Vertex3f -0.8 -0.8 0)
(gl:Vertex3f 0.8 -0.8 0)
(gl:End)
(gl:DisableVertexAttribArray attribute_coord2d)
(glut:SwapBuffers))
Run Code Online (Sandbox Code Playgroud)
和我的Init功能
(define (initFunc)
(gl:ClearColor 1 1 1 1)
(gl:Enable gl:TEXTURE_2D)
(gl:Enable gl:LIGHTING)
(gl:Enable gl:BLEND)
(gl:BlendFunc gl:SRC_ALPHA gl:ONE_MINUS_SRC_ALPHA)
(set! program (CreatePorgram (list
(CreateShader gl:VERTEX_SHADER (LoadScript "vs.glsl"))
(CreateShader gl:FRAGMENT_SHADER (LoadScript "vf.glsl")))))
(set! attribute_coord2d (gl:GetAttribLocation program "coord2d"))
(print "attribute_coord2d: " attribute_coord2d)
(print "vbo_triangle: " vbo_triangle)
(print "program: " program)
(print (gl:GetError)))
Run Code Online (Sandbox Code Playgroud)
不确定为什么但着色器正确加载等等.glGetError没有返回任何错误,一切似乎工作正常.
我将我的代码基于本教程,它在我的机器上编译并正常工作:
http://en.wikibooks.org/wiki/OpenGL_Programming/Modern_OpenGL_Introduction
我觉得这个错误与我的方案绑定有关.当着色器绑定到内存中时,我们可以释放发送到opengl的源.我很确定生成着色器后,着色器的源代码会被释放.
我很遗憾找到了我的代码中的不同之处,我听说过glUniform,但我相信在我的情况下它应该不是很重要.
我用过glBegin,glEnd因为我在创建VBO时遇到了一些问题.如果要求vbos,那么我将确保它首先工作.
顺便说一句,我们应该看到黑色三角形而不是黑色三角形.
这是叠加三角形时的样子.呈现黑色的像素不是完全随机的.它们实际上形成某种模式,而仍然是白色的像素在大多数时候总是白色.

可能是gl_FragColor是一个vec4,期待一个alpha值.混合已启用但未初始化的值会保留为片段alpha值导致闪烁?
这样可以解决吗?
gl_FragColor = vec4(0,0,0,1);
Run Code Online (Sandbox Code Playgroud)
它闪烁的原因是调度线程(执行片段着色器)的时间.线程最终驻留在内存中,其中alpha值位置恰好具有GPU正在执行的先前事物的数据.