好久没搞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;
}
}