语言:D
图书馆:DerelictGL3
我试图从D拨打glShaderSource( GLuint,GLsizei,const( GLchar* )*,const( GLint )* )
我在字符串中有着色器源,第一个参数有着色器ID。
我遇到的问题是最后3个参数的语法,我设法得到的都是编译器错误。我不知道如何从包含着色器源的字符串转到我最后3个参数所需的内容,特别是第3个参数const( GLchar* )*
我正在寻找执行此操作的示例代码以及代码正在执行的操作的说明,从字符串转到最后3个参数所需的内容。
答案 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);