c++ - GLSL VertexShader 适用于 Qt 但不适用于普通 OpenGL(SL)

标签 c++ qt opengl glsl

我目前正在 Qt 中基于 QOpenGLWidget 开发 OpenGL-Widget。我遵循了一些示例并使用 GLSL-Wrapper 进行演示。出于兼容性目的,应用程序本身应尽可能独立,例如更改 GUI 框架。

当 Qt 代码负责着色器时,应用程序可以正常工作:

QOpenGLShader *vshader = new QOpenGLShader(QOpenGLShader::Vertex, this);
const char *vsrc =
    "uniform mediump mat4 matrix;\n"
    "void main(void)\n"
    "{\n"
    "    gl_Position = matrix * gl_Vertex;\n"
    "    gl_FrontColor = gl_Color;\n"
    "}\n";

bool success = vshader->compileSourceCode(vsrc);

program = new QOpenGLShaderProgram();
program->addShader(vshader);
program->link();

接下来,我自己上传并编译着色器:

const char *vsrc =
    "uniform mediump mat4 matrix;\n"
    "void main(void)\n"
    "{\n"
    "    gl_Position = matrix * gl_Vertex;\n"
    "    gl_FrontColor = gl_Color;\n"
    "}\n";
GLuint programmID = glCreateProgram();
GLuint shaderID = glCreateShader(GL_VERTEX_SHADER);
int length =(int) std::char_traits<char>::length(vsrc);
glShaderSource(shaderID, 1, &vsrc, &length);
glCompileShader(shaderID);
char *error = new char[1000];
int* messagelength = new int;
glGetShaderInfoLog(shaderID, (GLsizei)1000, messagelength, error);
string str = string(error, *messagelength);
std::cout << str << std::endl << std::flush;
delete error;
delete messagelength;
glAttachShader(programmID, shaderID);
glDeleteShader(shaderID);
glLinkProgram(programmID);
glUseProgram(programmID);

但是,这会导致以下错误:

0(1) : error C0000: syntax error, unexpected type identifier, expecting '{' at token "mat4"
0(4) : warning C7506: OpenGL does not define the global type matrix
0(4) : warning C7531: pointers requires "#extension GL_NV_shader_buffer_load : enable" before use
0(4) : error C0000: syntax error, unexpected identifier, expecting '(' at token "gl_Vertex"

我如何使它工作?

最佳答案

好吧,您的代码在桌面 GL 中无效。由于您的着色器不包含 #version 指令,因此它将被解释为 GLSL 1.10。而且该版本不知道像 mediump 这样的精度限定符。 (稍后只需接受该关键字,以提高与 GLSL ES 的兼容性)。

请注意,Qt 很可能默认使用 GL ES 2.0(而不是桌面 GL),这取决于您的本地配置以及 qt 库的构建方式。

另请注意,您的着色器在桌面 GL 的现代核心配置文件中完全无效。

我能给你的唯一建议是首先决定你想要/必须以哪个版本(或多个版本)的 OpenGL 为目标。

关于c++ - GLSL VertexShader 适用于 Qt 但不适用于普通 OpenGL(SL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31219518/

相关文章:

c++ - 没有来自 wxWidget 应用程序的 cout,但是使用 Eclipse 它工作正常

visual-studio - Visual Studio - 扩展安装 "Cannot find setup engine instance."

c++ - FFmpeg:为什么录制的视频质量远低于在 OpenGL 中渲染的质量

c++ - 为实体形状绘制带线边框的有效方法

c++ - 问题 C++ STD 迭代器比较运算符

c++ - 检查输入的数字,如果找不到数字则默认为一个值

python - 如何向 C/C++ 程序添加 Python 控制台

qt - 如何将 Qt 与 Julia 一起使用

c++ - 从 QGridLayout 中删除边框

opengl - 如何在 Matrix4f 中获取当前的 OpenGL 变换矩阵?