【问题标题】:Having trouble glShaderSource( GLuint,GLsizei,const( GLchar* )*,const( GLint )* ) from D从 D 遇到问题 glShaderSource(GLuint,GLsizei,const(GLchar*)*,const(GLint)*)
【发布时间】:2016-03-25 20:14:14
【问题描述】:

语言:D
库:DerelictGL3

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

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

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

【问题讨论】:

    标签: opengl d derelict3


    【解决方案1】:

    您需要将 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

    【讨论】:

    • 不得不做的" immutable(char*) sourceC = toStringz(vertexShaderSource); glShaderSource(vertexShaderId, 1, &sourceC, null);"为了让编译器真正编译
    • 我已经用正确的版本编辑了我的答案,以防将来有人发现它。
    【解决方案2】:

    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);
    

    【讨论】:

      猜你喜欢
      • 2012-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-07
      • 1970-01-01
      • 1970-01-01
      • 2019-04-30
      相关资源
      最近更新 更多