模板操作,提供了一些技巧的空间,要实现各种效果,模板是一个好工具.随着看书,写了一些代码.先画一个小三角形,相应的模板值设为1,再画一个大三角形,参考值大于模板值的通过测试,可以继续绘制,效果就是一个大三角形套着小三角形.
// Stencil.cpp -- 2013/11/20-21:38
#include "stdafx.h"
#include <GLTools.h>
#include <GLShaderManager.h>
#define FREEGLUT_STATIC
#include <GL/glut.h>
GLBatch smallTriangleBatch;
GLBatch bigTriangleBatch;
GLShaderManager shaderManager;
void ChangeSize(int w, int h)
{
glViewport(0, 0, w, h);
}
void SetupRC()
{
glClearColor(0.0f, 0.0f, 1.0f, 1.0f );
shaderManager.InitializeStockShaders();
GLfloat vSmallVerts[] = { -0.5f, 0.0f, 0.0f,
0.5f, 0.0f, 0.0f,
0.0f, 0.5f, 0.0f };
smallTriangleBatch.Begin(GL_TRIANGLES, 3);
smallTriangleBatch.CopyVertexData3f(vSmallVerts);
smallTriangleBatch.End();
GLfloat vBigVerts[] = { -1.0f, 0.0f, 0.0f,
1.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f };
bigTriangleBatch.Begin(GL_TRIANGLES, 3);
bigTriangleBatch.CopyVertexData3f(vBigVerts);
bigTriangleBatch.End();
glEnable(GL_STENCIL_TEST);
}
void RenderScene(void)
{
glClearStencil(0) ;
glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
// 总是通过模板测试,用参考值按位与掩码值. 0x01 & 0xff = 0x1
glStencilFuncSeparate(GL_FRONT, GL_ALWAYS, 1, 0xff) ;
// 第2,3,4个参数依次为:模板测试失败时的动作,深度测试失败时的动作,深度测试通过时的动作
glStencilOpSeparate(GL_FRONT, GL_KEEP, GL_KEEP, GL_REPLACE) ;
GLfloat vRed[] = { 1.0f, 0.0f, 0.0f, 1.0f };
shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vRed);
smallTriangleBatch.Draw();
// 参考值(1)大于模板缓冲区的值则通过测试
glStencilFuncSeparate(GL_FRONT, GL_GREATER, 1, 0xff) ;
glStencilOpSeparate(GL_FRONT, GL_KEEP, GL_KEEP, GL_KEEP) ;
GLfloat vGreen[] = {0, 1.0f, 0, 1.0f} ;
shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vGreen) ;
bigTriangleBatch.Draw() ;
glutSwapBuffers();
}
int main(int argc, char* argv[])
{
gltSetWorkingDirectory(argv[0]);
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_STENCIL);
glutInitWindowSize(800, 600);
glutCreateWindow("Triangle");
glutReshapeFunc(ChangeSize);
glutDisplayFunc(RenderScene);
GLenum err = glewInit();
if (err != GLEW_OK)
{
fprintf(stderr, "GLEW Error: %s\n", glewGetErrorString(err));
return 1;
}
SetupRC();
glutMainLoop();
return 0;
}
多说两句,最近一段时间压力是相当地大.项目美术试水试得差不多了,资源也渐渐多了起来,游戏内容也商定好了,逻辑细节也完成了,该到优化游戏的时候了,资源管理的前期做得不错,增加资源不是问题,规则很好.下一步加载的优化包括速度和大小,还有就是渲染质量,前一阵解决多重采样后白色亮点的问题,用逐pixel光照计算解决了,接下来还有使聚光灯有阴影,等等等等,问题比较多,每天的信息量也很大.有时觉得力不从心,不过没办法,而且也有信心做好,自己的积累虽无经验,但是理论有些了解,解决起来并不难.
入行2年了,不知道算长算短,也不知道自己走得算不算远,还好一直在走,也按着自己的步伐在走,还算是不错.加油吧,加油~