C++ 尝试修复OpenGL 2D中导致精灵变形的精灵表像素出血
在一个项目中工作时,我遇到了一个常见的问题,即在尝试绘制我的精灵表的子区域时像素出血。这导致我的精灵边缘出现了一些“接缝” 在进行一些搜索时,我发现其他人也有类似的问题,建议的解决方案(例如)是将纹理坐标偏移一点,例如0.5。我试过这个,它似乎奏效了。但我注意到,有时,根据精灵或相机的位置,精灵会出现一些变形,和。(我应该注意到,失真发生在各个方面,我只是碰巧在底部和左侧拍摄了它的屏幕截图。)在屏幕截图中可能有点难以看到,但在运动中它肯定是明显的。 有人知道这里发生了什么吗?直到最近我才注意到这个问题。当我看到像素出血发生在我的平铺精灵之间时,我开始着手解决它。使用我目前的半像素偏移解决方案,他们不会出现这个新问题(或者,如果出现了,也不会引起注意) 代码: 纹理参数C++ 尝试修复OpenGL 2D中导致精灵变形的精灵表像素出血,c++,opengl,C++,Opengl,在一个项目中工作时,我遇到了一个常见的问题,即在尝试绘制我的精灵表的子区域时像素出血。这导致我的精灵边缘出现了一些“接缝” 在进行一些搜索时,我发现其他人也有类似的问题,建议的解决方案(例如)是将纹理坐标偏移一点,例如0.5。我试过这个,它似乎奏效了。但我注意到,有时,根据精灵或相机的位置,精灵会出现一些变形,和。(我应该注意到,失真发生在各个方面,我只是碰巧在底部和左侧拍摄了它的屏幕截图。)在屏幕截图中可能有点难以看到,但在运动中它肯定是明显的。 有人知道这里发生了什么吗?直到最近我才注意到
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
纹理坐标计算
std::vector<glm::vec4> Texture2D::GetUVs(int w, int h)
{
std::vector<glm::vec4> uvs;
int rows = Width/ w;
int columns = Height / h;
for(int c = 0; c < columns; c ++)
{
for(int i = 0; i < rows; i ++)
{
float offset = 0.5;
uvs.emplace_back(glm::vec4(float(((i) * w + offset))/Width,
float(((1 + i) * w - offset))/Width,
float(((c) * h + offset))/Height,
float(((1 + c) * h - offset))/Height));
}
}
return uvs;
其中uv是在上面的GetUV函数中返回的uv向量索引处的uv
顶点着色器
#version 330 core
layout (location = 0) in vec2 vertex;
out vec2 TextureCoordinates;
uniform vec2 uvs[6];
uniform mat4 model;
uniform mat4 projection;
void main()
{
const vec2 position [6] = vec2[]
(
vec2(0.0f, 1.0f),
vec2(1.0f, 0.0f),
vec2(0.0f, 0.0f),
vec2(0.0f, 1.0f),
vec2(1.0f, 1.0f),
vec2(1.0f, 0.0f)
);
TextureCoordinates = uvs[gl_VertexID];
gl_Position = projection * model * vec4(position[gl_VertexID], 0.0, 1.0);
}
片段着色器
#version 330 core
in vec2 TextureCoordinates;
out vec4 color;
uniform sampler2D image;
uniform vec4 spriteColor;
void main()
{
color = vec4(spriteColor) * texture(image, TextureCoordinates);
}
感谢阅读,任何帮助都将不胜感激
#version 330 core
in vec2 TextureCoordinates;
out vec4 color;
uniform sampler2D image;
uniform vec4 spriteColor;
void main()
{
color = vec4(spriteColor) * texture(image, TextureCoordinates);
}