有问题 glShaderSource( GLuint,GLsizei,const( GLchar* )*,const( GLint )* ) 来自 D

Having trouble glShaderSource( GLuint,GLsizei,const( GLchar* )*,const( GLint )* ) from D

语言:D
图书馆:DerelictGL3

我正在尝试从 D 呼叫 glShaderSource( GLuint,GLsizei,const( GLchar* )*,const( GLint )* )

我有一个字符串中的着色器源和第一个参数的着色器 ID。

我遇到的问题是最后 3 个参数的语法,我设法得到的只是编译器错误。我不知道如何从包含着色器源的字符串到我需要的最后 3 个参数,尤其是第三个参数 const( GLchar* )*
我正在寻找执行此操作的示例代码以及代码正在做什么的解释,从字符串到最后 3 个参数所需的内容。

您需要将 D 字符串转换为以零结尾的 C 字符串 char*:

immutable(char*) sourceC = toStringz(vertexShaderSource);
glShaderSource(vertexShaderId, 1, &sourceC, null);

最后一个参数可以为空,因为这样它会将字符串视为零终止。请参阅文档:https://www.opengl.org/sdk/docs/man/html/glShaderSource.xhtml

第三个参数实际上应该是一个字符串数组,所以是const(char*)*。在 C 中,a pointer can be used to simulate an array like this.

glShaderSource 接受一个字符数组数组,以及这些字符数组的长度数组。

我使用 "character arrays" 因为它们绝对不是 D 字符串(又名 immutable(char)[]s,它本身是一个指针和长度的元组),而且它们也不完全是 C 字符串(必须以 null 结尾;size 参数可让您执行其他操作)。

现在,您可以使用 toStringz 将 D 字符串转换为 C 字符串,但这会产生不必要的分配。您可以改为直接传递 D 字符串中的数据:

// Get the pointer to the shader source data, and put it in a 1-sized fixed array
const(char)*[1] shaderStrings = [vertexShaderSource.ptr];
// Same but with shader source length
GLint[1] shaderSizes = [vertexShaderSource.length];
// Pass arrays to glShaderSource
glShaderSource(vertexShaderID, shaderStrings.length, shaderStrings.ptr, shaderSizes.ptr);