混合的理论
- 不考虑深度和模板的情况下
代码内容修改
- 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;
}
效果