一个十分有趣的问题 (续)

      今天白天尝试了很多,最后是把当作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的值进去。

  

      其他的以后再说。

你可能感兴趣的:(一个十分有趣的问题 (续))