问题描述
我使用的是 OpenGL 3.3。有必要让精灵一直看着相机。
在大多数情况下,代码来自 learnopenGL 课程,我对其进行了修改以满足我的需要。我尝试了不同的方法,但到目前为止我还没有设法做一些有效的事情。
投影是透视的。
glm::mat4 projection = glm::perspective(glm::radians(fov),(float)width_ / (float)height_,0.1f,30.0f);
我是这样画精灵的。
void SpriteRenderer3D::DrawSprite(const Texture2D& texture,glm::vec3 position,glm::vec3 camera_pos,glm::vec3 size,float rotate,glm::vec3 color) {
// activate shader
shader.Use();
// create transformations
glm::mat4 model = glm::mat4(1.0f); // make sure to initialize matrix to identity matrix first
model = glm::translate(model,glm::vec3(position)); // first translate (transformations are: scale happens first,then rotation,and then final translation happens; reversed order)
model = glm::translate(model,glm::vec3(0.5f * size.x,0.5f * size.y,0.5f * size.z)); // move origin of rotation to center of quad
model = glm::rotate(model,glm::radians(rotate),glm::vec3(0.0f,1.0f,0.0f));
model = glm::translate(model,glm::vec3(-0.5f * size.x,-0.5f * size.y,-0.5f * size.z)); // move origin back
model = glm::scale(model,glm::vec3(size)); // last scale
this->shader.SetMatrix4("model",model);
// render textured quad
this->shader.SetVector3f("spriteColor",color);
glActiveTexture(GL_TEXTURE0);
texture.Bind();
}
我使用这个 Vshader。
#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec2 aTexCoord;
out vec2 TexCoords;
uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;
void main()
{
gl_Position = projection * view * model * vec4(aPos,1.0);
TexCoords = vec2(aTexCoord.x,aTexCoord.y);
}
移动相机时,视图矩阵是这样考虑的。
glm::mat4 view = glm::lookAt(cameraPos,cameraPos + cameraFront,cameraUp);
ResourceManager::GetShader("sprite3d").SetMatrix4("view",view);
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)