示例#1
0
void ShaderMaterial::init()
{
//    m_vertexGL3Shader->setVertexShaderCode(QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/materials/shaders/gl3/brain.vert"))));
//    m_vertexGL3Shader->setFragmentShaderCode(QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/materials/shaders/gl3/brain.frag"))));

    m_vertexGL3Shader->setVertexShaderCode(QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/materials/shaders/gl3/pervertexphongalpha.vert"))));
    m_vertexGL3Shader->setFragmentShaderCode(QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/materials/shaders/gl3/pervertexphongalpha.frag"))));

    m_vertexGL3Technique->graphicsApiFilter()->setApi(QGraphicsApiFilter::OpenGL);
    m_vertexGL3Technique->graphicsApiFilter()->setMajorVersion(3);
    m_vertexGL3Technique->graphicsApiFilter()->setMinorVersion(1);
    m_vertexGL3Technique->graphicsApiFilter()->setProfile(QGraphicsApiFilter::CoreProfile);

    m_vertexGL3RenderPass->setShaderProgram(m_vertexGL3Shader);

    QBlendState* pBlendState = new QBlendState();
    pBlendState->setSrcRGB(QBlendState::SrcAlpha);
    pBlendState->setDstRGB(QBlendState::OneMinusSrcAlpha);

    QCullFace* pCullFace = new QCullFace();
    pCullFace->setMode(QCullFace::Back);

    QDepthTest* pDepthTest = new QDepthTest();
    pDepthTest->setFunc(QDepthTest::Less);

    QDepthMask* pDepthMask = new QDepthMask();
    pDepthMask->setMask(true);

    QBlendEquation* pBlendEquation = new QBlendEquation();
    pBlendEquation->setMode(QBlendEquation::FuncAdd);

    m_vertexGL3RenderPass->addRenderState(pBlendState);
    m_vertexGL3RenderPass->addRenderState(pCullFace);
    m_vertexGL3RenderPass->addRenderState(pDepthTest);
    m_vertexGL3RenderPass->addRenderState(pDepthMask);
    m_vertexGL3RenderPass->addRenderState(pBlendEquation);

    m_vertexGL3Technique->addPass(m_vertexGL3RenderPass);

    m_vertexEffect->addTechnique(m_vertexGL3Technique);

    m_vertexEffect->addParameter(m_ambientParameter);
    m_vertexEffect->addParameter(m_diffuseParameter);
    m_vertexEffect->addParameter(m_specularParameter);
    m_vertexEffect->addParameter(m_shininessParameter);
    m_vertexEffect->addParameter(m_alphaParameter);

    this->setEffect(m_vertexEffect);
}
/*!
 * \internal
 */
void QSkyboxEntityPrivate::init()
{
    m_gl3Shader->setVertexShaderCode(QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/gl3/skybox.vert"))));
    m_gl3Shader->setFragmentShaderCode(QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/gl3/skybox.frag"))));
    m_gl2es2Shader->setVertexShaderCode(QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/es2/skybox.vert"))));
    m_gl2es2Shader->setFragmentShaderCode(QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/es2/skybox.frag"))));

    m_gl3Technique->openGLFilter()->setApi(QOpenGLFilter::Desktop);
    m_gl3Technique->openGLFilter()->setMajorVersion(3);
    m_gl3Technique->openGLFilter()->setMajorVersion(1);
    m_gl3Technique->openGLFilter()->setProfile(QOpenGLFilter::Core);

    m_gl2Technique->openGLFilter()->setApi(QOpenGLFilter::Desktop);
    m_gl2Technique->openGLFilter()->setMajorVersion(2);
    m_gl2Technique->openGLFilter()->setMajorVersion(0);
    m_gl2Technique->openGLFilter()->setProfile(QOpenGLFilter::None);

    m_es2Technique->openGLFilter()->setApi(QOpenGLFilter::ES);
    m_es2Technique->openGLFilter()->setMajorVersion(2);
    m_es2Technique->openGLFilter()->setMajorVersion(0);
    m_es2Technique->openGLFilter()->setProfile(QOpenGLFilter::None);

    m_gl3RenderPass->setShaderProgram(m_gl3Shader);
    m_gl2RenderPass->setShaderProgram(m_gl2es2Shader);
    m_es2RenderPass->setShaderProgram(m_gl2es2Shader);

    QCullFace *cullFront = new QCullFace();
    cullFront->setMode(QCullFace::Front);
    QDepthTest *depthTest = new QDepthTest();
    depthTest->setFunc(QDepthTest::LessOrEqual);

    m_gl3RenderPass->addRenderState(cullFront);
    m_gl3RenderPass->addRenderState(depthTest);
    m_gl2RenderPass->addRenderState(cullFront);
    m_gl2RenderPass->addRenderState(depthTest);
    m_es2RenderPass->addRenderState(cullFront);
    m_es2RenderPass->addRenderState(depthTest);

    m_gl3Technique->addPass(m_gl3RenderPass);
    m_gl2Technique->addPass(m_gl2RenderPass);
    m_es2Technique->addPass(m_es2RenderPass);

    m_effect->addTechnique(m_gl3Technique);
    m_effect->addTechnique(m_gl2Technique);
    m_effect->addTechnique(m_es2Technique);

    m_material->setEffect(m_effect);
    m_material->addParameter(m_textureParameter);

    m_transform->addTransform(m_translate);

    m_mesh->setXYMeshResolution(QSize(2, 2));
    m_mesh->setXZMeshResolution(QSize(2, 2));
    m_mesh->setYZMeshResolution(QSize(2, 2));

    m_posXImage->setCubeMapFace(QTextureCubeMap::CubeMapPositiveX);
    m_posYImage->setCubeMapFace(QTextureCubeMap::CubeMapPositiveY);
    m_posZImage->setCubeMapFace(QTextureCubeMap::CubeMapPositiveZ);
    m_negXImage->setCubeMapFace(QTextureCubeMap::CubeMapNegativeX);
    m_negYImage->setCubeMapFace(QTextureCubeMap::CubeMapNegativeY);
    m_negZImage->setCubeMapFace(QTextureCubeMap::CubeMapNegativeZ);

    m_skyboxTexture->setMagnificationFilter(QTextureCubeMap::Linear);
    m_skyboxTexture->setMinificationFilter(QTextureCubeMap::Linear);
    m_skyboxTexture->setGenerateMipMaps(false);
    m_skyboxTexture->setWrapMode(QTextureWrapMode(QTextureWrapMode::ClampToEdge));

    m_skyboxTexture->addTextureImage(m_posXImage);
    m_skyboxTexture->addTextureImage(m_posYImage);
    m_skyboxTexture->addTextureImage(m_posZImage);
    m_skyboxTexture->addTextureImage(m_negXImage);
    m_skyboxTexture->addTextureImage(m_negYImage);
    m_skyboxTexture->addTextureImage(m_negZImage);

    q_func()->addComponent(m_mesh);
    q_func()->addComponent(m_material);
    q_func()->addComponent(m_transform);
}