OpenGl编程指南例2.4大白话分析

本文分析了OpenGL编程指南例2.4,讲解了如何处理OpenGL中的uniform block,包括其内存分配和与CPU内存交互的过程。通过示例程序,解释了如何创建、编译shader,以及如何在GPU和CPU之间同步uniform数据。文章强调了OpenGL作为状态机的工作方式,以及使用shader在现代显卡上进行高性能计算的重要性。
摘要由CSDN通过智能技术生成

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
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值