我无法使用模板缓冲区绘制深度复杂度。
我尝试使用these steps:
void CALLBACK display(void)
{
MatriceUmbra(points, sourcePosition, shadowMatrix);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
glLoadIdentity();
glRotatef(50.0, 1.0, 1.0, 1.0);
glRotatef(beta, 0, 1, 0);
//glRotatef (gama, 1, 1, 1);
glClear(GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_STENCIL_TEST);
glStencilFunc(GL_ALWAYS, 0, 0);
glStencilOp(GL_KEEP, GL_INCR, GL_INCR);
glPushMatrix();
pamant();
glPushMatrix();
glDisable(GL_LIGHTING);
//glDisable(GL_DEPTH_TEST);
glColor4f(0.0, 0.1, 0.0, 0.7);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glMultMatrixf((GLfloat*)shadowMatrix);
glStencilFunc(GL_EQUAL, 1, 1);
glStencilMask(GL_FALSE);
glDisable(GL_DEPTH_TEST);
caruta();
glPopMatrix();
glEnable(GL_LIGHTING);
glEnable(GL_DEPTH_TEST);
caruta();
glPopMatrix();
glFlush();
int *data = malloc(500 * 500 * 4);
glReadPixels(0, 0, 500, 500, GL_STENCIL_INDEX, GL_INT, data);
glDrawPixels(500, 500, GL_COLOR_INDEX, GL_INT, data);
}
void CALLBACK myReshape(GLsizei w, GLsizei h)
{
if (!h) return;
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h)
glOrtho(-400, 400, -400 * (GLfloat)h / (GLfloat)w, 400 * (GLfloat)h / (GLfloat)w, -600.0, 600.0);
else
glOrtho(-400 * (GLfloat)w / (GLfloat)h, 400 * (GLfloat)w / (GLfloat)h, -400, 400, -600.0, 600.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
int main(int argc, char** argv)
{
auxInitDisplayMode(AUX_SINGLE | AUX_RGB | AUX_DEPTH16 | AUX_STENCIL);
auxInitPosition(0, 0, 500, 500);
auxInitWindow("Iluminarea");
myinit();
auxKeyFunc(AUX_RIGHT, inainte);
auxKeyFunc(AUX_LEFT, inapoi);
auxKeyFunc(AUX_UP, interiorul_carutei);
auxReshapeFunc(myReshape);
auxMainLoop(display);
return(0);
}
当前,我看到了初始场景,但看不到深度复杂性。
我的对象是一辆购物车,我看到了,但是我也尝试绘制链接中前面提到的深度复杂度。
以下是我尝试失败的步骤:
清除深度和模板缓冲区:
glClear(GL_STENCIL_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
启用屏蔽:
glEnable(GL_STENCIL_TEST)
设置适当的模具参数:
glStencilFunc(GL_ALWAYS, 0, 0)
glStencilOp(GL_KEEP, GL_INCR, GL_INCR)
绘制场景。
glReadPixels()
作为格式参数,用GL_STENCIL_INDEX
读回模板缓冲区。glDrawPixels()
作为格式参数,使用GL_COLOR_INDEX
在屏幕上绘制模板缓冲区。答案 0 :(得分:0)
OpenGL是一个状态引擎。设置状态后,状态会一直保存到再次更改为止,甚至超出帧数。
还要注意,glStencilMask()
的参数是位掩码而不是布尔值。
设置为glStencilMask()
的值会影响所有模板缓冲区的写入,甚至会影响glClear
。
在display()
的中间,禁止写入模板缓冲区
glStencilMask(GL_FALSE);
请注意,参数应为0x00
而不是GL_FALSE
,但是由于GL_FALSE
为0
,因此在这种情况下无关紧要。
该值将保持不变,并且不会再次更改。您必须在display()
的开头glClear()
之前启用模板缓冲区写入:
void CALLBACK display(void)
{
MatriceUmbra(points, sourcePosition, shadowMatrix);
glStencilMask(0xff); // <----- this is missing
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
glEnable(GL_STENCIL_TEST);
glStencilFunc(GL_ALWAYS, 0, 0);
glStencilOp(GL_KEEP, GL_INCR, GL_INCR);
// ...
glStencilFunc(GL_EQUAL, 1, 1);
glStencilMask(0x00);
// ...
}