[英]GLSL VertexShader works with Qt but not plain OpenGL(SL)
我目前正在基於QOpenGLWidget在Qt中開發OpenGL-Widget。 我遵循了一些示例,並將GLSL包裝器用於演示目的。 為了兼容起見,應用程序本身應盡可能獨立,例如更改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
指令,因此#version
其解釋為GLSL 1.10。 該版本不知道諸如mediump
之類的精度限定mediump
。 (以后只接受該關鍵字,以提高與GLSL ES的兼容性)。
請注意,根據您的本地配置以及qt庫的構建方式,Qt很可能會默認使用GL ES 2.0(而不是桌面GL)作為默認值。
還要注意,在現代桌面GL核心配置文件中,着色器完全無效。
我能給您的唯一建議是,首先確定您要/必須定位的OpenGL版本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.