今天白天尝试了很多,最后是把当作QOpenGLWidget普通的QWidget用,可以使用QPainter来画。那后面就是着色的问题了。可不管怎样都得看opengl教程。折腾着折腾着,QT可以默认使用OpenGL ES 2.0
现在,无奈看起《OpenGL ES 2.0 编程指南》,边看边试着写QT代码,写注释。写着写着,看到OpenGL ES 2.0 是以可编程着色器为基础的,这意味着你绘制任何图形都必须有一个合适的着色器装载和绑定,需要定点着色器和片段着色器,不然做不了任何渲染。
于是想着去拷贝hellogl2例子中的着色器代码,然后按照指南上的修改,忽然间看到两个着色器的第一行都是"#version 150\n"
然后就想起了那个有趣的问题
syntax error: #version is mandatory and should be set before any other token
它的意思就是“#version”是必须的,应该被设置在任何其他的之前。而那时我天真的以为是qt代码里format设置version问题。所以百思不得其解。现在知道了,是在“任何其他(着色器的)变量或代码”之前。
所以一个简单的顶点着色器代码可以是这样
static const char *vertexShaderSourceCore =
"#version 150\n"
"in vec4 vPosition;\n"
"void main() {\n"
" gl_Position = vPosition;\n"
"}\n";
例子中的代码是
static const char *vertexShaderSourceCore =
"#version 150\n"
"in vec4 vertex;\n"
"in vec3 normal;\n"
"out vec3 vert;\n"
"out vec3 vertNormal;\n"
"uniform mat4 projMatrix;\n"
"uniform mat4 mvMatrix;\n"
"uniform mat3 normalMatrix;\n"
"void main() {\n"
" vert = vertex.xyz;\n"
" vertNormal = normalMatrix * normal;\n"
" gl_Position = projMatrix * mvMatrix * vertex;\n"
"}\n";
初始化是链接
m_program = new QOpenGLShaderProgram;
m_program->addShaderFromSourceCode(QOpenGLShader::Vertex, m_core ? vertexShaderSourceCore : vertexShaderSource);
m_program->addShaderFromSourceCode(QOpenGLShader::Fragment, m_core ? fragmentShaderSourceCore : fragmentShaderSource);
m_program->bindAttributeLocation("vertex", 0);
m_program->bindAttributeLocation("normal", 1);
m_program->link();
可以看到 vertex, 0 normal, 1
这个马上可以猜到是设置参数值,传递两个in的值进去。
其他的以后再说。