【问题标题】:Not sure how to solve shader errors? [closed]不确定如何解决着色器错误? [关闭]
【发布时间】:2023-03-27 02:51:01
【问题描述】:

错误:

ERROR: 0:1: 'basicVertex120' : syntax error parse error

代码:

#version 120

attribute vec3 position;
attribute vec2 texCoord;

varying vec2 texCoord0;

uniform mat4 transform;

void main()
{
    gl_Position = transform * vec4(position, 1.0);
    texCoord0 = texCoord;
}

我一直在关注这里的教程:http://www.youtube.com/watch?v=8n1GV99FJ2Y&list=PLEETnX-uPtBXP_B2yupUKlflXBznWIlL5&index=11

他的教程中的所有代码都在这里:https://github.com/BennyQBD/3DGameEngine

我并没有完全遵循它,但就着色器类和所有内容而言,它是完全相同的。如果您需要发布任何其他代码...请告诉我。

我对 OpenGL 2.0+ 和 GLSL 还是很陌生,并试图弄清楚如何知道哪一行有错误。有像 GL11.glGetError(); 这样的顶点着色器的东西吗?

是否有任何我可以使用的工具或我可以浏览的文档来尝试解决问题?

我真的很想学习自己解决这些问题。我该怎么做?

【问题讨论】:

  • 是的,使用 glGetShaderInfoLog (我看到它在你链接的源代码中确实这样做了)。更重要的是,我看不到您请求 OpenGL 版本的任何地方。我认为提供 glsl 1.1 的 2.0 上下文不会有 #version 指令,但这只是一个猜测,因为我只使用 OpenGL 3.1+。
  • 我在代码中使用了 glGetShaderInfoLog,因为它没有提供任何真实信息……我认为它没用。 - 我正在运行的 OpenGL 版本是 3.0,它确实打印它...但是我没有包括它。 #Version 120 等同于 OpenGL 2.1,虽然我不太确定你的第三句话是什么意思。
  • @Xonar:这实际上是一个灰色地带。 GLSL 1.1 规范的早期版本。没有定义#version#extension 预处理器指令,所以一些早期的实现可能不支持它。不过我从来没有遇到过这个问题。

标签: java opengl glsl vertex-shader


【解决方案1】:

当人们尝试逐行读取着色器文件而不是一次读取整个文件时,这种情况经常发生。他们经常忘记在读取行缓冲文件时,会从每一行中删除行尾。因此,所有内容都在第 1 行结束,预处理器认为整个着色器是一个长得可笑的 #version 指令。

如果您逐字遵循该代码,这应该不是问题,但您永远不会知道。

我会考虑从 GL 查询着色器字符串并查看它的实际上解析,以及编译器日志:

GLsizei src_len,
        log_len;

glGetShaderiv (shader, GL_INFO_LOG_LENGTH,      &log_len);
glGetShaderiv (shader, GL_SHADER_SOURCE_LENGTH, &src_len);

GLchar* src_str = calloc (src_len + 1, sizeof (GLchar));
GLchar* log_str = calloc (log_len + 1, sizeof (GLchar));

glGetShaderInfoLog (shader, log_len, NULL, log_str);
glGetShaderSource  (shader, src_len, NULL, src_str);

printf ("Shader %d\n",      shader);
printf (" >> Info:   %s\n", log_str);
printf (" >> Source: %s\n", src_str);

free (log_str);
free (src_str);

我意识到这是用 C 编写的;我不熟悉 Java 绑定,但大体流程是一样的。

【讨论】:

  • 我现在不能像我想要的那样好好看看它,所以我明天会这样做。不过,我会这么说。当我使用“glGetShaderSource”请求着色器源时,我得到的长度为 18,源如下所示:“basicVertex120.vs”这让我认为某些东西的编码非常错误,因为那是名称,而不是源。就像我说的,我必须回到你身边。 - 因为在您发布后我还没有尝试解决问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-19
  • 2015-03-23
  • 2014-09-05
相关资源
最近更新 更多