【问题标题】:Whats wrong with this glsl code?这个 glsl 代码有什么问题?
【发布时间】:2015-01-26 12:32:22
【问题描述】:

我正在尝试从.txt 文件加载一个简单的 GLSL 程序。这是加载文件的函数:

string getShaderSource(char path[])
{
    string out;
    ifstream mFile;
    stringstream buf;
    mFile.open(path);
    if (mFile.is_open())
    { 
        buf << mFile.rdbuf();
        out = buf.str();
    }
    else
        printf("Cannot open shader source file.");      
    mFile.close();
    //out.append("\0");
    return out;
}

我使用这样的函数:

string vs = getShaderSource("C:/vs.txt");
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, (const GLchar**)&vs, NULL);

问题是着色器无论如何都无法编译,这是错误:

0(1) : error C0000: syntax error, unexpected $undefined at token "&lt;undefined&gt;"

非常简单的 GLSL 代码:

#version 410 
layout (location = 0) in vec3 vp;
layout (location = 1) in vec3 color;
smooth out vec4 theColor;
void main () {
    gl_Position = vec4 (vp, 1.0);
    theColor = vec4(color, 0.0);
}

我知道那里有类似的问题,我已经尝试了很多来解决问题,但没有任何进展。我做错了什么?

【问题讨论】:

  • 您已经展示了加载着色器源的代码,但问题在于着色器源的编译。请出示这个。要排除您的着色器源加载器,请暂时对您的着色器源进行硬编码,然后查看是否收到相同的消息。
  • vs是什么类型的?
  • @Axalo std::string,抱歉 fs 是一个错字。
  • @Poldie 是的,我尝试将 GLSL 代码存储为 const char*,这样可以正常工作,但当我尝试从文件加载它时却不行。我认为我的 txt 文件加载功能有问题。
  • 最好接受指向字符的指针,因为必须初始化数组(它们是引用)。 OpenGL 不会理解字符串,因此不建议返回它然后执行丑陋的类型转换。最好将字符串转换为 char* 然后将其传入。另外,添加片段着色器,否则您将看不到任何颜色。

标签: c++ file opengl text glsl


【解决方案1】:

在下面一行:

glShaderSource(vertexShader, 1, (const GLchar**)&vs, NULL);

您正在将 std::string 转换为 GLchar**。 那是行不通的。

改成

const char *s = vs.c_str();
glShaderSource(vertexShader, 1, (const GLchar**)&s, NULL);

here

【讨论】:

  • VS 给出错误提示:表达式必须是左值或函数指示符
  • 程序运行,顶点着色器和片段着色器都编译成功,但是没有颜色。任何想法为什么??
  • @EdwardMckinzie 你至少能看到什么吗?
  • 是的,它是一个具有不同颜色的基本矩形,但只有白色矩形可见。你可以在这里查看整个代码:pastebin.com/download.php?i=Cegtj63J
  • @EdwardMckinzie 代码并没有真正的帮助。无论如何,我建议您再问一个问题,因为这里还有很多其他人可以帮助您。
【解决方案2】:
string fs = getShaderSource("C:/vs.txt");
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, (const GLchar**)&vs, NULL);

这很可疑。正确的代码是这样的:

string fs = getShaderSource("C:/vs.txt");
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);

char* vs = fs.c_str();
glShaderSource(vertexShader, 1, (const GLchar**)&vs, NULL);

std::string 的第一个成员不能保证是保存数据的char*,而是在变量中显式获取指针并将指针传递给该变量。

【讨论】:

    猜你喜欢
    • 2012-08-07
    • 2014-08-29
    • 2013-06-05
    • 2014-06-04
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多