Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用OpenGL进行预Z缓冲区传递?_C++_C_Opengl - Fatal编程技术网

C++ 使用OpenGL进行预Z缓冲区传递?

C++ 使用OpenGL进行预Z缓冲区传递?,c++,c,opengl,C++,C,Opengl,如何使用openGL进行Z缓冲区预处理 我试过这个: glcolormask(0,0,0,0); //disable color buffer //draw scene glcolormask(1,1,1,1); //reenable color buffer //draw scene //flip buffers 但它不起作用。这样做之后,我什么也看不到。做这件事最好的方法是什么 谢谢如果我没记错的话,您正在尝试禁用OpenGL执行的深度测试以确定剔除。您在这里使用的是颜色函数,这对

如何使用openGL进行Z缓冲区预处理

我试过这个:

glcolormask(0,0,0,0); //disable color buffer

//draw scene

glcolormask(1,1,1,1); //reenable color buffer

//draw scene

//flip buffers
但它不起作用。这样做之后,我什么也看不到。做这件事最好的方法是什么


谢谢

如果我没记错的话,您正在尝试禁用OpenGL执行的深度测试以确定剔除。您在这里使用的是颜色函数,这对我来说没有意义。我认为你正在努力做到以下几点:

glDisable(GL_DEPTH_TEST); // disable z-buffer

// draw scene

glEnable(GL_DEPTH_TEST); // enable z-buffer

// draw scene

// flip buffers

不要忘记在每次传递开始时清除深度缓冲区。

使用glColorMask做的事情是正确的

然而,如果你没有看到任何东西,很可能是因为你使用了错误的深度测试功能。 您需要GL_LEQUAL,而不是GL_LESS(这恰好是默认值)


基本上,我在做一个Z预科,避免画某些东西。事实上,这和他要求的正好相反。Z预通道仅用于测试深度,而不计算任何照明。这个想法是,你可以使用一个便宜的深度测试来尽早拒绝很多被遮挡的物体,并节省昂贵的光照计算,只用于将要看到的几何体。好吧,我自己从来没有写过Z预处理程序,所以我会听从有过的人。但我可以想象,在着色器管道中,如果你能更好地控制渲染的具体位置,那么这将容易得多。你是否只想用固定函数管道来实现这一点?使用着色器可能会容易得多。
glDepthFunc(GL_LEQUAL);
// clear everything
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

// z-prepass
glEnable(GL_DEPTH_TEST);  // We want depth test !
glDepthFunc(GL_LESS);     // We want to get the nearest pixels
glcolormask(0,0,0,0);     // Disable color, it's useless, we only want depth.
glDepthMask(GL_TRUE);     // Ask z writing

draw()

// real render
glEnable(GL_DEPTH_TEST);  // We still want depth test
glDepthFunc(GL_LEQUAL);   // EQUAL should work, too. (Only draw pixels if they are the closest ones)
glcolormask(1,1,1,1);     // We want color this time
glDepthMask(GL_FALSE);    // Writing the z component is useless now, we already have it

draw();