gpt4 book ai didi

windows - gl_FragDepth 断色

转载 作者:可可西里 更新时间:2023-11-01 09:33:20 24 4
gpt4 key购买 nike

我的电脑好像不能用gl_FragDepth。我的程序运行良好,没有 glsl 错误,glGetError 返回 0,但我无法从片段着色器写入深度缓冲区。

此外,在 gl_FragDepth 中写入会更改像素颜色的红色分量。

我的程序有简化版。我修剪了所有无用的东西(我猜?),但效果并没有好多少:

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

最佳答案

会不会是你的集成显卡驱动卡在了这条线上?

glfwWindowHint(GLFW_DEPTH_BITS, 64);

64 位对于深度缓冲区来说太多了。 24 位是一个更典型的值。如果不支持 64 位深度缓冲区,上下文创建应该会失败,但如果深度缓冲区设置不正确,我会看到一些 OpenGL 驱动程序的奇怪行为。

关于windows - gl_FragDepth 断色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32697451/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com