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

时间:2016-03-25 20:14:14

标签: opengl d derelict3

语言:D
图书馆:DerelictGL3

我试图从D拨打glShaderSource( GLuint,GLsizei,const( GLchar* )*,const( GLint )* )

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

我遇到的问题是最后3个参数的语法,我设法得到的都是编译器错误。我不知道如何从包含着色器源的字符串转到我最后3个参数所需的内容,特别是第3个参数const( GLchar* )*
我正在寻找执行此操作的示例代码以及代码正在执行的操作的说明,从字符串转到最后3个参数所需的内容。

2 个答案:

答案 0 :(得分:1)

您需要将D字符串转换为C 0终止char*

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

最后一个参数可以为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

答案 1 :(得分:1)

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

我使用"字符数组"因为它们绝对不是D字符串(又名immutable(char)[] s,它本身就是指针和长度的元组),并且它们不是完全C字符串(必须为空终止; 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);