【问题标题】:Shader GLSL file Not compiling着色器 GLSL 文件未编译
【发布时间】:2011-10-04 20:18:24
【问题描述】:

我正在使用 OpenGL 编写我的第一个程序,并且我已经到了试图让它编译我非常简单的着色器程序的地步。我总是收到无法编译着色器的错误。我使用以下代码编译着色器:

struct Shader
{
    const char*  filename;
    GLenum       type;
    GLchar*      source;
 };
...
static char* readShaderSource(const char* shaderFile)
{
    FILE* fp = fopen(shaderFile, "r");

    if ( fp == NULL ) { return NULL; }

    fseek(fp, 0L, SEEK_END);
    long size = ftell(fp);

    fseek(fp, 0L, SEEK_SET);
    char* buf = new char[size + 1];
    fread(buf, 1, size, fp);

    buf[size] = '\0';
    fclose(fp);

    return buf;
}
...
Shader s;
s.filename = "<name of shader file>";
s.type = GL_VERTEX_SHADER;
s.source = readShaderSource( s.filename );
GLuint shader = glCreateShader( s.type );
glShaderSource( shader, 1, (const GLchar**) &s.source, NULL );
glCompileShader( shader );

而我的shader文件源如下:

#version 150

in vec4 vPosition;

void main()
{
    gl_Position = vPosition;
}

我还尝试将“in”替换为“attribute”以及删除版本行。没有任何东西可以编译。 注意:我的实际 C 程序编译并运行。在 GPU 上运行的着色器程序是无法编译的。

我还确保下载我的显卡的最新驱动程序。我有一个 NVIDIA 8800 GTS 512;

关于如何编译我的着色器程序(用 GLSL 编写)有什么想法吗?

【问题讨论】:

  • info log 说什么?文件是否正确加载(所以s.source 包含正确的着色器源)?否则看起来很合理。
  • 您可以使用 gDebugger(免费)来了解错误、修复和重试,而无需重新启动应用程序
  • Jeremy,你是如何检查编译失败的?由于您的代码看起来没问题,也许您只是错误地检查了编译状态。

标签: opengl glsl shader


【解决方案1】:

正如 cmets 中所写,编译着色器是否会向控制台输出任何内容?令我惊讶的是,当我使用 ATI 时,我收到了着色器程序编译成功的消息,但是当我开始使用 Nvidia 时,我第一次盯着屏幕,因为没有输出......但是着色器正在工作。所以也许你已经成功编译并且不接受它?如果它们不在上下文中工作,您尝试使用着色器程序并且没有任何反应,我认为您错过了着色器的链接(但是它可能在代码中更进一步)。谷歌有一些关于如何正确执行每一步的好答案,你可以将你的代码与这个example进行比较。我还制作了一个用于工作 whit 着色器的界面,你可以看看我的UniShader。项目缺乏英文文档,主要用于GPGPU,但你可以轻松加载任何着色器,并且代码本身是用英文命名编写的,所以应该很舒服。在该 zip 中的文件夹 UniShader 中查找源代码。也有几个例子,一个名为 Ukazkovy 程序 na GPGPU 的源代码也包含在内,所以你可以看看如何使用这些类。祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多