Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 尝试修复OpenGL 2D中导致精灵变形的精灵表像素出血_C++_Opengl - Fatal编程技术网

C++ 尝试修复OpenGL 2D中导致精灵变形的精灵表像素出血

C++ 尝试修复OpenGL 2D中导致精灵变形的精灵表像素出血,c++,opengl,C++,Opengl,在一个项目中工作时,我遇到了一个常见的问题,即在尝试绘制我的精灵表的子区域时像素出血。这导致我的精灵边缘出现了一些“接缝” 在进行一些搜索时,我发现其他人也有类似的问题,建议的解决方案(例如)是将纹理坐标偏移一点,例如0.5。我试过这个,它似乎奏效了。但我注意到,有时,根据精灵或相机的位置,精灵会出现一些变形,和。(我应该注意到,失真发生在各个方面,我只是碰巧在底部和左侧拍摄了它的屏幕截图。)在屏幕截图中可能有点难以看到,但在运动中它肯定是明显的。 有人知道这里发生了什么吗?直到最近我才注意到

在一个项目中工作时,我遇到了一个常见的问题,即在尝试绘制我的精灵表的子区域时像素出血。这导致我的精灵边缘出现了一些“接缝”

在进行一些搜索时,我发现其他人也有类似的问题,建议的解决方案(例如)是将纹理坐标偏移一点,例如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);
}