混合.在模板操作之后.代码内容是先一个小三角形,再一个大三角形.这块摆弄得还不麻利,先这样.
// Blending.cpp -- 2013/11/21-20:58 #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, 0.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_BLEND); } void RenderScene(void) { glClear(GL_COLOR_BUFFER_BIT); // R = Rsrc * Sr㈠ + Rdst * Dr㈡ // G = Gsrc * Sg㈠ + Gdst * Dg㈡ // B = Bsrc * Sb㈠ + Bdst * Db㈡ // A = Asrc * Sa㈢ + Adst * Da㈣ glBlendEquationSeparate(GL_FUNC_ADD, GL_FUNC_ADD) ; // ㈠:GL_SRC_ALPHA // ㈡:GL_DST_ALPHA // ㈢:GL_SRC_ALPHA // ㈣:GL_DST_ALPHA glBlendFuncSeparate(GL_SRC_ALPHA, GL_DST_ALPHA, GL_SRC_ALPHA, GL_DST_ALPHA) ; GLfloat vRed[] = { 1.0f, 0.0f, 0.0f, 1.0f }; shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vRed); smallTriangleBatch.Draw(); GLfloat vGreen[] = {0, 1.0f, 0, 0.5f} ; 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); 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; }