看來我無法在我的電腦上使用gl_FragDepth。我的程序運行良好,否則,沒有glsl錯誤,glGetError返回0,但我無法從片段着色器中寫入深度緩衝區。gl_FragDepth破色
此外,在gl_FragDepth中寫入更改了像素顏色的紅色分量。
有我的程序的簡化版本。我修剪所有無用的東西(我GESS?),並且它沒有更好的工作:
int main(void)
{
// These are custom structures for handling shader programs.
t_glprog prog;
t_glprog prog2;
GLuint vbo;
GLFWwindow *window;
static const GLfloat vertab[] =
{
-1.0, -1.0, 1.0,
1.0, -1.0, 1.0,
1.0, 1.0, 1.0,
-1.0, 1.0, 1.0
};
char const *vert =
"attribute vec3 Coord;"
"void main() {\
gl_Position = vec4(Coord, 1.0);\
}";
char const *frag1 =
"void main() {\
gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);\
gl_FragDepth = sin(gl_FragCoord.x * 0.1);\
}";
char const *frag2 =
"void main() {\
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\
gl_FragDepth = cos(gl_FragCoord.x * 0.1);\
}";
if (!glfwInit())
{
fprintf(stderr, "GLFW failed to init.\n");
return (-1);
}
glfwWindowHint(GLFW_DEPTH_BITS, 64);
window = glfwCreateWindow(640, 480, "TEST", NULL, NULL);
if (window == NULL)
{
fprintf(stderr, "Failed to open GLFW window.\n");
glfwTerminate();
return (-1);
}
glfwMakeContextCurrent(window);
// For Windows.
if (glewInit() != GLEW_OK)
{
fprintf(stderr, "Failed to initialize GLEW\n");
return (-1);
}
glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glClearDepth(1.0);
glViewport(0, 0, 640, 480);
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertab), vertab, GL_STATIC_DRAW);
create_shaders_prog(&prog, vert, frag1);
create_shaders_prog(&prog2, vert, frag2);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glUseProgram(prog.prog);
glDrawArrays(GL_QUADS, 0, 4);
glUseProgram(prog2.prog);
glDrawArrays(GL_QUADS, 0, 4);
glFlush();
glfwSwapBuffers(window);
while (glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS &&
glfwWindowShouldClose(window) == 0)
{
glfwPollEvents();
}
return (0);
}
它應該借鑑紅綠條紋,而是我得到模糊的紅線。如果我刪除第二個drawcall,它是一樣的。 在Windows上,即。我在OSX上測試它,並按預期工作。
下面是一些glGetString規格:
GL_VENDOR : Intel
GL_RENDERER : Mobile Intel(R) 4 Series Express Chipset Family
GL_VERSION : 2.1.0 - Build 8.15.10.1892
GL_SHADING_LANGUAGE_VERSION : 1.20 - Intel Build 8.15.10.1892
是否可以在您的應用程序中使用OpenGL 3.2或更高版本,而不是OpenGL 2.1? –
難道你不得不在事件循環內繪製嗎? –
我的電腦不支持OpenGL 3.2,我認爲gl_FragDepth從glsl 1.1開始就可用。而且,我不需要循環,也沒有動畫。 – Procrade