好久没搞OpenGL了,图形学的理论学的多,看来也需要多多动手做图形学软件,实际多做点东西出来才行。
因为理论书看了很多,但是一直没有太大的突破了,整个游戏是如何做成的,整个引擎怎么做出来的,基本所有相关技术我都了解,对我来说一点都不神秘,但是还是差那么一点点,觉得自己还没有达到专业水准。
感觉那么一点点就是个坎,一直跨不过去,好,这次一定要跨越它!
至于理论书看了多少本,我自己都忘记了,单单说大部头的纯英文书,都超过十几本吧。
这回少看理论了,而由简单的程序开始,下苦功夫,手打上百个程序再说,看看效果如何。
这个图形的效果如下:
像一个小杯子的,杯口是一个基本图形多边形polygen,杯身是一个线条Line Strip
很简陋,但是是纯粹手工确定点画成的。
下面带点注释的程序:
#pragma once #include <stdio.h> #include <GL\glew.h> #include <GL\freeglut.h> #include "math_3d.h" namespace Tutorial2_TwoShapes { GLuint VBO; void createGeometries() { Vector3f vers[10] = { Vector3f(-0.23f, 0.33f, 0.0f), Vector3f(-0.15f, 0.35f, 0.0f), Vector3f(0.15f, 0.35f, 0.0f), Vector3f(0.23f, 0.33f, 0.0f), Vector3f(0.15f, 0.25f, 0.0f), Vector3f(-0.15f, 0.25f, 0.0f), Vector3f(0.23f, 0.33f, 0.0f), Vector3f(0.23f, -0.35f, 0.0f), Vector3f(-0.23f, -0.35f, 0.0f), Vector3f(-0.23f, 0.33f, 0.0f) }; //三步创建buffer,提供数据给GPU Shader使用 glGenBuffers(1, &VBO); glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(vers), vers, GL_STATIC_DRAW); } static void RenderScene() { glClear(GL_COLOR_BUFFER_BIT); glEnableVertexAttribArray(0); glBindBuffer(GL_ARRAY_BUFFER, VBO); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); //分两步画图,第一画开口,然后或个四方形作为杯身 glDrawArrays(GL_POLYGON, 0, 6); glDrawArrays(GL_LINE_STRIP, 6, 4); glDisableVertexAttribArray(0); //别忘记了交换前后buffer glutSwapBuffers(); } static void initCallBack() { glutDisplayFunc(RenderScene); } int run(int argc, char **argv) { //一共5个函数初始化GLUT,最后Create窗口 glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);//注意:GL_DOUBLE GL_RGBA glutInitWindowSize(800, 600); glutInitWindowPosition(20, 20); glutCreateWindow("Bill's Two Shapes"); //初始化Call Back函数,相当于Windows编程中Call Back函数概念 initCallBack(); //初始化glew GLenum res = glewInit(); if (res != GLEW_OK) { fprintf(stderr, "Error: '%s'\n", glewGetErrorString(res)); return 1; } //清屏 glClearColor(0.0f, 0.0f, 0.0f, 0.0f); createGeometries(); glutMainLoop(); return 0; } }
OpenGL一: 初始化窗口,简单画图,布布扣,bubuko.com
原文:http://blog.csdn.net/kenden23/article/details/26619529