用模板类封装OpenGL Shader 的Uniform变量

struct UniformTypeName

{

std::string name;

E_UniformType type;

};

static UniformTypeName  _datatypeToGlsl[17] = {

{"float", UT_FLOAT}, {"vec2", UT_FLOAT_VEC2}, {"vec3", UT_FLOAT_VEC3}, {"vec4", UT_FLOAT_VEC4},

{"int", UT_INT},     {"ivec2", UT_INT_VEC2},  {"ivec3",UT_INT_VEC3},   {"ivec4", UT_INT_VEC4},

{"bool",UT_BOOL},    {"bvec2", UT_BOOL_VEC2}, {"bvec3",UT_BOOL_VEC3},  {"bvec4", UT_BOOL_VEC4},

{"mat2", UT_FLOAT_MAT2},  {"mat3", UT_FLOAT_MAT3}, {"mat4", UT_FLOAT_MAT4},

{"sampler2D", UT_SAMPLER_2D},{"samplerCube", UT_SAMPLER_CUBE}};

class AutomaticUniformBase: public UniformBase

{

public:

AutomaticUniformBase(){}

~AutomaticUniformBase(){}

std::string getDeclaration(const std::string& name)

{

std::string declaration = "uniform " + getDataTypeName(this->_datatype) + " " + name;

std::stringstream sizestr;

sizestr<<_size;

if (_size == 1) {

declaration += ";";

} else {

declaration += "[" + sizestr.str() + "];";

}

return declaration;

}

std::string getDataTypeName(E_UniformType typeEnum)

{

std::string result("");

for(int i = 0; i< sizeof(_datatypeToGlsl); i++)

{

if(typeEnum == _datatypeToGlsl[i].type)

{

result = _datatypeToGlsl[i].name;

break;

}

}

return result;

}

};

template<class T>

class AutomaticUniform: public AutomaticUniformBase

{

public:

AutomaticUniform()

{

this->_uniformClassType = UCT_AUTO;

}

typedef T (* GetValueFunc)(UniformState*);

AutomaticUniform( unsigned int size, E_UniformType type, GetValueFunc getValue)

{

this->_size = size;

this->_datatype = type;

this->_getValue = getValue;

this->_uniformClassType = UCT_AUTO;

}

struct Option

{

unsigned int _size;

E_UniformType _datatype;

GetValueFunc _getValue;

};

AutomaticUniform(const Option& option)

{

this->_size = option._size;

this->_datatype = option._datatype;

this->_getValue = option._getValue;

this->_uniformClassType = UCT_AUTO;

}

public:

GetValueFunc _getValue;

};

时间: 2024-12-30 04:37:51

用模板类封装OpenGL Shader 的Uniform变量的相关文章

浅谈JavaEE中的JDBC模板类的封装实现以及合理的建立项目包结构(一)

从今天开始我们一起来聊下有关,javaEE开发中的一些知识,JavaEE的开发用于企业级的开发,但是现在企业中一般也不会使用JDBC开发,大部分都是使用自己公司开发的一套的框架,但是这些框架的架构一般也是会模仿着有名JavaEE开源三大开发框架SSH(Struts2+Spring+Hibernate)或者现在也很流行的SSM开发框架(Spring+SpringMVC+MyBatis) 来进行深度定制以便于适合自己企业的实际开发需求.有的人曾说既然去公司又是重新学习一套框架,还有必要学习开源的三大

A Simple OpenGL Shader Example II

A Simple OpenGL Shader Example II [email protected] Abstract. The OpenGL Shading Language syntax comes from the C family of programming languages. Tokes, identifiers, semicolons, nesting with curly braces, control-flow, and many key words look like C

OpenGL Shader in OpenCASCADE

OpenGL Shader in OpenCASCADE [email protected] Abstract. As implementation of one of the strategic steps in OpenCASCADE visualization component development road-map, support for GLSL shader programs has been added in OpenCASCADE Technology 6.7.0. Key

c++ char_traits模板类的实现!!!

本人写过与此相关的两篇博客,一个是<cstring>头文件的实现,还有一个是<cwchar>的实现.这里的char_traits模板类在此基础上实现. 为了方便.将源码一起封装于名字空间mystd里. 代码例如以下!!! // 此文件命名为 "char_traits.h" // vs2012 调试通过 #pragma once #ifndef MYSTD_CHAR_TRAITS_H #define MYSTD_CHAR_TRAITS_H #include<

【C++】智能指针类和OpenCV的Ptr模板类

智能指针类 引用计数 智能指针(smart pointer)的一种通用实现技术是使用引用计数(reference count).智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象的指针指向同一对象.引用计数为0时,删除对象. 其基本使用规则是: 每次创建类的新对象时,初始化指针并将引用计数置为1.当对象作为另一对象的副本而创建时,复制构造函数复制指针并增加与之相应的引用计数的值.对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数的值(如果引用计数减至0,则删除对

借助模板类自动实现COM连接点接收器(Sink)更新

之前在借助模板类自动实现COM连接点接收器(Sink)中对原作者的代码进一步封装,弄清了连接点使用的原理,在看ATL代码的过程中,发现ATL本身就提供了AtlAdvise/AtlUnadvise这样的机制来简化连接点的使用,CComPtrBase中也有Advise这个成员函数,它是对AtlAdvise,进一步封装,因此,对ConnectionHelper的代码可以再简化,简化后Connect()只有十来行了.原作者写的GetConnectPoint函数也用不上了. ? 1 2 3 4 5 6 7

C++_模板类与类型萃取技术

在声明变量,函数,和大多数其他类型实体的时候,C++要求我们使用指定的类型.然而,有许多代码,除了类型不同之外,其余部分看起来都是相同的,比如,下面这个例子: bool IsEqual (int left, int right) {     return left == right; } bool IsEqual (const string& left , const string& right) {     return left == right; } void test() {   

(转)JDBC模板类。

Spring JDBC抽象框架core包提供了JDBC模板类,其中JdbcTemplate是core包的核心类,所以其他模板类都是基于它封装完成的,JDBC模板类是第一种工作模式. JdbcTemplate类通过模板设计模式帮助我们消除了冗长的代码,只做需要做的事情(即可变部分),并且帮我们做哪些固定部分,如连接的创建及关闭. JdbcTemplate类对可变部分采用回调接口方式实现,如ConnectionCallback通过回调接口返回给用户一个连接,从而可以使用该连 接做任何事情.State

借助模板类自动实现COM连接点接收器(Sink)

最初的代码源自free2000fly的一个标准的 COM 连接点接收器(Sink)的实现, 使用相当简单!!!,作者封装了不少工作,但调用时的代码还可以再封装一下,最后只要拷贝并修改Sink实现类的Invoke就好了. 以下是这个代码的头文件 "sinkimpl.h",比free2000fly的"sinkimpl.h"多了一个模板类ConnectionPointerHelper<> ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1