OpenGl编程指南例2.4分析
即上一篇文章搭建了opengl的环境后,继续学习Opengl,被第二章的各种gen,bind,buffer搞得晕头转向,在还没有消化完全的时候,又被一计重击打到——为uniform block分配内存。
幸亏书中提供了例程,在分析完例程后,觉得有些许收获,特在此记录下来日后参考。
注:
- 例2.4的例程不是一个完整的程序,因此不需要尝试编译了
- 例2.4英文原书pdf有个小错误就是把GL_STATIC_DRAW写成了GL_STATIC_RAW中文版本是否有错误我并不清楚,但反正也不能编译,所以无所谓了
- 例2.4的Load_shader子程序其实不能执行例子中实现的直接给字串的形式,但为了做说明,且鉴于不是完整程序,所以仅在这里提出来,如果有想完善整个例2.4的人,这里需要额外的工作
- 下面先给出我在英文注解下添加中文注释的程序,此后再结合注释把我所理解的部分与大家分享。
例2.4
/* Vertex and fragment shaders that share a block of uniforms
** named "Uniforms" */
#include <iostream>
#include "vgl.h"
#include "LoadShaders.h"
const char* vShader = {
"#version 330 core\n"
"uniform Uniforms {"
" vec3 translation;"
" float scale;"
" vec4 rotation;"
" bool enabled;"
"};"
"in vec2 vPos;"
"in vec3 vColor;"
"out vec4 fColor;"
"void main()"
"{"
" vec3 pos = vec3(vPos, 0.0);"
" float angle = radians(rotation[0]);"
" vec3 axis = normalize(rotation.yzw);"
" mat3 I = mat3(1.0);"
" mat3 S = mat3( 0, -axis.z, axis.y, "
" axis.z, 0, -axis.x, "
" -axis.y, axis.x, 0);"
" mat3 uuT = outerProduct(axis, axis);"
" mat3 rot = uuT + cos(angle)*(I - uuT) + sin(angle)*S;"
" pos *= scale;"
" pos *= rot;"
" pos += translation;"
" fColor = vec4(scale, scale, scale, 1);"
" gl_Position = vec4(pos, 1);"
"}"
};
const char* fShader = {
"#version 330 core\n"
"uniform Uniforms {"
" vec3 translation;"
" float scale;"
" vec4 rotation;"
" bool enabled;"
"};"
"in vec4 fColor;"
"out vec4 color;"
"void main()"
"{"
" color = fColor;"
"}"
};
/* Helper function to convert GLSL types to storage sizes */
size_t
TypeSize(GLenum type)
{
size_t size;
#define CASE(Enum, Count, Type) \
case Enum: size = Count * sizeof(Type); break
switch (type) {
CASE(GL_FLOAT, 1, GLfloat);
CASE(GL_FLOAT_VEC2, 2, GLfloat);
CASE(GL_FLOAT_VEC3, 3, GLfloat);
CASE(GL_FLOAT_VEC4, 4, GLfloat);
CASE(GL_INT, 1, GLint);
CASE(GL_INT_VEC2, 2, GLint