0

我不太确定这个问题是由什么引起的,我从来没有太多使用着色器的经验,所以它可能与实际的着色器无关(很可能问题不在着色器中)

我有这个结果

在此处输入图像描述

片段着色器

#version 120
void main(void) {
  gl_FragColor[0] = 0.0;
  gl_FragColor[1] = 0.0;
  gl_FragColor[2] = 0.0;
}

顶点着色器

#version 120
attribute vec2 coord2d;

void main(void) {
  gl_Position = vec4(coord2d, 0.0, 1.0);
}

我的渲染功能

(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))

还有我的初始化函数

(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)))

不知道确切原因,但着色器被正确加载等等。glGetError不返回任何错误,一切似乎都正常。

我的代码基于本教程,该教程在我的机器上编译和工作正常:

http://en.wikibooks.org/wiki/OpenGL_Programming/Modern_OpenGL_Introduction

我觉得这个错误与我的方案绑定有关。当着色器绑定到内存中时,我们可以释放发送到 opengl 的源吗?我很确定一旦着色器生成,着色器的源代码就会被释放。

我很迷失在我的代码中有什么不同,我听说过 glUniform 但我相信在我的情况下它应该不重要。

我使用glBeginandglEnd因为我在创建 VBO 时遇到了一些问题。如果 vbos 是一个要求,那么我会确保它首先工作。

顺便说一句,我们应该看到一个黑色三角形,而不是一个由黑点组成的三角形。

这是叠加一百个三角形时的样子。呈现为黑色的像素并不是完全随机的。它们实际上形成了某种图案,而仍然为白色的像素在大多数情况下始终是白色的。

在此处输入图像描述

4

1 回答 1

5

难道 gl_FragColor 是一个 vec4,期望一个 alpha 值。混合已启用,但未初始化的值保留为导致闪烁的片段 alpha 值?

这能解决吗?

gl_FragColor = vec4(0,0,0,1);

它闪烁的原因与调度线程(执行片段着色器)的时间有关。线程最终驻留在内存中,其中 alpha 值位置恰好具有来自 GPU 之前正在执行的操作的数据。

于 2013-09-25T09:34:09.277 回答