opengl之混合

混合的理论

openglCN官网之混合

  • 不考虑深度和模板的情况下在这里插入图片描述

代码内容修改

  • glsl:由于启用了混合,我们就不需要丢弃片段了,所以我们把片段着色器还原(这里我们用的是透明值)
	FragColor=vec4(result,texColor.a);
  • 主函数修改
  • 首先生成模型model都是一样的,所以都提出来;然后旋转效果去掉
        for (_modelsIter = _models.begin(); _modelsIter != _models.end(); _modelsIter++)
        {
            glStencilFunc(GL_ALWAYS, 1, 0xFF);
            model = glm::translate(trans, _modelsIter->second.worldPosition);
           // _modelsIter->second.modelMatrix = model = glm::rotate(model, (float)glfwGetTime(), glm::vec3(0.0f, 1.0f, 0.0f));
            if (_modelsIter->first == modelSelected)
            {
      
                modelShader.useShader();
                modelShader.setMat4("model", model);
                _modelsIter->second.Draw(modelShader);
                glStencilFunc(GL_NOTEQUAL, 1, 0xFF);
                glStencilMask(0x00);
                float scale = 1.02;
                model = glm::translate(model, glm::vec3(0.0f, 7.5f, 0.0f));
                model = glm::scale(model, scale * glm::vec3(1, 1, 1));
                _modelsIter->second.modelMatrix = model = glm::translate(model, glm::vec3(0.0f, -7.5f, 0.0f));
                stencilShader.useShader();
                stencilShader.setMat4("model", model);
                _modelsIter->second.Draw(stencilShader);
                glStencilMask(0xFF);

                caoShader.useShader();
               
                model = glm::translate(model, modelPos);
                caoShader.setMat4("model", model);
                cao.Draw(caoShader);
            }
            else {

                modelShader.useShader();
                modelShader.setMat4("model", model);
                _modelsIter->second.Draw(modelShader);
            }
        }
  • 开启混合效果,并且暂时先关闭模板测试以及执行函数
	//启用混合效果
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);//原因子和目标因子
  • 添加窗口代码以及窗口位置,还有map进行遍历,并且按照距离摄像机的位置对模型进行排序
    vector<glm::vec3> windows
    {
        glm::vec3(-1.5f, 0.0f, 2.48f),
        glm::vec3(-1.0f, 0.1f, 2.51f),
        glm::vec3(-0.5f, 0.2f, 2.61f),
        glm::vec3(0.0f, 0.3f, 2.71f),
        glm::vec3(0.5f, 0.4f, 2.81f)
    };
    std::map<float, glm::vec3> sortedWindows;
    //对模型位置进行排序
    for (unsigned int i = 0; i < windows.size(); i++)
    {
        float distance = glm::length(camera.Position - windows[i]);
        //float distance=glm::distance(camera.Position,windowsPos[i]);
        sortedWindows[distance] = windows[i];
    }
  • 生成getmesh 一会进行数组统一绘图需要,在while循环外面以减少GPU开销,并且优化帧数
    Mesh mesh = getMesh();
  • 在人体模型之后,生成遍历器循环并且对内部元素进行绘制
        //生成遍历器循环并且进行绘制
        for (std::map<float, glm::vec3>::reverse_iterator it = sortedWindows.rbegin(); it != sortedWindows.rend(); ++it)
        {
            model = glm::mat4(1.0f);
            model = glm::translate(model, it->second);

            caoShader.useShader();
            caoShader.setMat4("model", model);
            mesh.Draw(caoShader);
        }
  • 测试帧数(在while循环最后)
        static int ticks = -1;
        ticks++;
        static double _lastTime = glfwGetTime();

        if (ticks == 60)
        {
            double deltaTime = glfwGetTime() - _lastTime;
            _lastTime = glfwGetTime();
            
            cout << "帧数" <<ticks/ deltaTime << endl;
            ticks = 0;
        }

效果

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值