簡體   English   中英

GLSL VertexShader可與Qt一起使用,但不能與普通OpenGL(SL)一起使用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM