gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:11:15 24 4
gpt4 key购买 nike

我目前正在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com