小编eSe*_*mel的帖子

我如何安全地确保根据OpenGL规范正确实现char*类型(在任何平台上)?

在尝试使用c ++和OpenGL3 +进行图形编程时,我遇到了一个稍微专门的理解问题,包括char类型,指向它的指针以及潜在的隐式或显式转换到其他char指针类型.我想我已经找到了一个解决方案,但我想通过要求你对此进行双重检查.

当前(2014年10月)OpenGL4.5核心配置文件规范(2.2章命令语法中的表2.2)列出了OpenGL数据类型并明确说明了

GL类型不是C类型.因此,例如,GL类型int在本文档之外被称为GLint,并且不一定等同于C类型int.实现必须精确使用表中指示的位数来表示GL类型.

此表中的GLchar类型被指定为位宽8的类型,用于表示组成字符串的字符.
为了进一步缩小GLchar提供的范围,我们可以看一下GLSL规范(OpenGL着色语言4.25,2014年7月,第3.1章字符集和编译阶段):

用于OpenGL着色语言的源字符集是UTF-8编码方案中的Unicode.

现在,我在任何OpenGL库头中实现它的方式,我关心的是一个简单的

typedef char GLchar;
Run Code Online (Sandbox Code Playgroud)

当然,我刚才引用了"GL类型不是C类型"的说法.

通常,这不会是一个问题,因为typedef仅适用于底层类型可能在将来发生变化的情况.

问题始于用户实现.

通过几个关于OpenGL的教程,我遇到了各种方法将GLSL源代码分配给处理它所需的GLchar数组.(请原谅我没有提供所有链接.目前,我没有这样做的声誉.)

网站open.gl喜欢这样做:

const GLchar* vertexSource =
"#version 150 core\n"
"in vec2 position;"
"void main() {"
"   gl_Position = vec4(position, 0.0, 1.0);"
"}";
Run Code Online (Sandbox Code Playgroud)

或这个:

// Shader macro
#define GLSL(src) "#version 150 core\n" #src

// Vertex shader
const GLchar* vertexShaderSrc = GLSL(
  in vec2 pos;

  void main() {
      gl_Position = vec4(pos, 0.0, 1.0);
  }
);
Run Code Online (Sandbox Code Playgroud)

在lazyfoo.net(第30章加载文本文件着色器)中,源代码从文件(我的首选方法)读取到一个std::string shaderString变量中,然后用于初始化GL字符串:

const GLchar* …
Run Code Online (Sandbox Code Playgroud)

c++ opengl type-conversion type-safety char-pointer

6
推荐指数
2
解决办法
859
查看次数

标签 统计

c++ ×1

char-pointer ×1

opengl ×1

type-conversion ×1

type-safety ×1