我使用 LWJGL 和 Clojure 编写了一个测试套件来测试使用帧缓冲区的 OpenGL 渲染。 以下程序应该将两个四边形渲染到帧缓冲区中。 请参阅此处了解离屏渲染实现。
(def vertex-passthrough
"#version 410 core
in vec3 point;
void main()
{
gl_Position = vec4(point, 1);
}")
(def fragment-blue
"#version 410 core
out vec3 fragColor;
void main()
{
fragColor = vec3(0.0, 0.0, 1.0);
}")
(def fragment-red
"#version 410 core
out vec3 fragColor;
void main()
{
fragColor = vec3(1.0, 0.0, 0.0);
}")
(fact "Correct switching between two vertex array objects and shader programs"
(offscreen-render 160 120
(let [indices [0 1 3 2]
vertices1 [-1.0 -1.0 0.1, 0.5 -1.0 0.1, -1.0 0.5 0.1, 0.5 0.5 0.1]
vertices2 [-0.5 -0.5 0.2, 1.0 -0.5 0.2, -0.5 1.0 0.2, 1.0 1.0 0.2]
program1 (make-program :sfsim.render/vertex [vertex-passthrough] :sfsim.render/fragment [fragment-red])
program2 (make-program :sfsim.render/vertex [vertex-passthrough] :sfsim.render/fragment [fragment-blue])
vao1 (make-vertex-array-object program1 indices vertices1 ["point" 3])
vao2 (make-vertex-array-object program2 indices vertices2 ["point" 3])]
(clear (vec3 0.0 0.0 0.0))
(use-program program1)
(render-quads vao1)
(use-program program2)
(render-quads vao2)
(destroy-vertex-array-object vao2)
(destroy-vertex-array-object vao1)
(destroy-program program2)
(destroy-program program1))) => (is-image "test/sfsim/fixtures/render/objects.png" 0.0))
在 AMD/ATI 卡上我得到了预期的结果:
但是,使用 NVidia GeForce RTX 2080 和专有驱动程序运行相同的测试套件不会显示第一个(红色)四核:
您知道问题可能是什么吗?
我在很多地方添加了
(println (GL11/glGetError))
,但收到错误 1282。所以我禁用了所有其他测试,现在它可以工作了。我将一一启用其他测试,看看哪一个没有关闭其 OpenGL 上下文属性。