OpenGL 入门教程(三) -- 混合
2017-12-06 17:23
288 查看
// Blending.cpp // Move a Block based on arrow key movements, // Blend it with background blocks #include <GLTools.h> // OpenGL toolkit #include <GLShaderManager.h> #ifdef __APPLE__ #include <glut/glut.h> #else #define FREEGLUT_STATIC #include <GL/glut.h> #endif GLBatch squareBatch; GLBatch greenBatch; GLBatch redBatch; GLBatch blueBatch; GLBatch blackBatch; GLShaderManager shaderManager; GLfloat blockSize = 0.2f; GLfloat vVerts[] = { -blockSize, -blockSize, 0.0f, blockSize, -blockSize, 0.0f, blockSize, blockSize, 0.0f, -blockSize, blockSize, 0.0f }; /////////////////////////////////////////////////////////////////////////////// // This function does any needed initialization on the rendering context. // This is the first opportunity to do any OpenGL related tasks. void SetupRC() { // Black background glClearColor(1.0f, 1.0f, 1.0f, 1.0f); shaderManager.InitializeStockShaders(); // Load up a triangle fan squareBatch.Begin(GL_TRIANGLE_FAN, 4); squareBatch.CopyVertexData3f(vVerts); squareBatch.End(); GLfloat vBlock[] = { 0.25f, 0.25f, 0.0f, 0.75f, 0.25f, 0.0f, 0.75f, 0.75f, 0.0f, 0.25f, 0.75f, 0.0f }; greenBatch.Begin(GL_TRIANGLE_FAN, 4); greenBatch.CopyVertexData3f(vBlock); greenBatch.End(); GLfloat vBlock2[] = { -0.75f, 0.25f, 0.0f, -0.25f, 0.25f, 0.0f, -0.25f, 0.75f, 0.0f, -0.75f, 0.75f, 0.0f }; redBatch.Begin(GL_TRIANGLE_FAN, 4); redBatch.CopyVertexData3f(vBlock2); redBatch.End(); GLfloat vBlock3[] = { -0.75f, -0.75f, 0.0f, -0.25f, -0.75f, 0.0f, -0.25f, -0.25f, 0.0f, -0.75f, -0.25f, 0.0f }; blueBatch.Begin(GL_TRIANGLE_FAN, 4); blueBatch.CopyVertexData3f(vBlock3); blueBatch.End(); GLfloat vBlock4[] = { 0.25f, -0.75f, 0.0f, 0.75f, -0.75f, 0.0f, 0.75f, -0.25f, 0.0f, 0.25f, -0.25f, 0.0f }; blackBatch.Begin(GL_TRIANGLE_FAN, 4); blackBatch.CopyVertexData3f(vBlock4); blackBatch.End(); } // Respond to arrow keys by moving the camera frame of reference void SpecialKeys(int key, int x, int y) { GLfloat stepSize = 0.025f; GLfloat blockX = vVerts[0]; // Upper left X GLfloat blockY = vVerts[7]; // Upper left Y if (key == GLUT_KEY_UP) blockY += stepSize; if (key == GLUT_KEY_DOWN) blockY -= stepSize; if (key == GLUT_KEY_LEFT) blockX -= stepSize; if (key == GLUT_KEY_RIGHT) blockX += stepSize; // Collision detection if (blockX < -1.0f) blockX = -1.0f; if (blockX > (1.0f - blockSize * 2)) blockX = 1.0f - blockSize * 2;; if (blockY < -1.0f + blockSize * 2) blockY = -1.0f + blockSize * 2; if (blockY > 1.0f) blockY = 1.0f; // Recalculate vertex positions vVerts[0] = blockX; vVerts[1] = blockY - blockSize * 2; vVerts[3] = blockX + blockSize * 2; vVerts[4] = blockY - blockSize * 2; vVerts[6] = blockX + blockSize * 2; vVerts[7] = blockY; vVerts[9] = blockX; vVerts[10] = blockY; squareBatch.CopyVertexData3f(vVerts); glutPostRedisplay(); } /////////////////////////////////////////////////////////////////////////////// // Called to draw scene void RenderScene(void) { // Clear the window with current clearing color glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); GLfloat vRed[] = { 1.0f, 0.0f, 0.0f, 0.5f }; GLfloat vGreen[] = { 0.0f, 1.0f, 0.0f, 1.0f }; GLfloat vBlue[] = { 0.0f, 0.0f, 1.0f, 1.0f }; GLfloat vBlack[] = { 0.0f, 0.0f, 0.0f, 1.0f }; shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vGreen); greenBatch.Draw(); shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vRed); redBatch.Draw(); shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vBlue); blueBatch.Draw(); shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vBlack); blackBatch.Draw(); glEnable(GL_BLEND);//启动混合 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);//混合函数 shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vRed);//设置当前存储着色器为填充模式 squareBatch.Draw(); glDisable(GL_BLEND); // Flush drawing commands glutSwapBuffers(); } /////////////////////////////////////////////////////////////////////////////// // Window has changed size, or has just been created. In either case, we need // to use the window dimensions to set the viewport and the projection matrix. void ChangeSize(int w, int h) { glViewport(0, 0, w, h); } /////////////////////////////////////////////////////////////////////////////// // Main entry point for GLUT based programs int main(int argc, char* argv[]) { gltSetWorkingDirectory(argv[0]); glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH); glutInitWindowSize(800, 600); glutCreateWindow("Move Block with Arrow Keys to see blending"); GLenum err = glewInit(); if (GLEW_OK != err) { // Problem: glewInit failed, something is seriously wrong. fprintf(stderr, "Error: %s\n", glewGetErrorString(err)); return 1; } glutReshapeFunc(ChangeSize); glutDisplayFunc(RenderScene); glutSpecialFunc(SpecialKeys); SetupRC(); glutMainLoop(); return 0; }
相关文章推荐
- Opengl 入门教程的翻译
- OpenGL 入门教程(五) -- 模型视图投影矩阵
- 【OpenCV入门教程之四】 ROI区域图像叠加&初级图像混合 全剖析
- OpenGL 入门基础教程 —— VAO 和 VBO辨析
- OpenGL 入门基础教程 —— 打开第一个窗口
- OpenGL 入门基础教程 —— 添加纹理
- opengl 入门教程
- OpenGL 入门教程(四)
- OpenGL 入门教程(六) 旋转加平移
- IOS 中openGL使用教程3(openGL ES 入门篇 | 纹理贴图(texture)使用)
- OpenGL入门教程(3)
- opengl入门教程
- 【OpenCV入门教程之四】 ROI区域图像叠加&初级图像混合 全剖析
- Andriod OpenGL 教程 08 - 混合
- OpenGL 入门基础教程 —— 基本术语篇【3】
- [转]【OpenCV入门教程之四】 ROI区域图像叠加&初级图像混合 全剖析
- OpenGL 入门基础教程 —— 在第一个窗口绘制一个三角形
- 【OpenCV入门教程之四】 ROI区域图像叠加&初级图像混合 全剖析
- 学习@浅墨_毛星云【OpenCV入门教程之五】 分离颜色通道&多通道图像混合
- opengl入门教程(1)