正如你所看到的那样,箭头旁边有一些奇怪的边缘。
这是我的OpenGL设置:
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, WINDOW_WIDTH, 0, WINDOW_HEIGHT, 1, -1);
glMatrixMode(GL_MODELVIEW);
这是我的渲染代码:
glPushMatrix();
Color.white.bind();
texture.bind();
glTranslatef(position.x+size.width/2, position.y+size.height/2, 0f);
glRotatef(rotation, 0f, 0f, 1f);
glTranslatef(-size.width/2, -size.height/2, 0f);
glBegin(GL_QUADS);
glTexCoord2f(0, 1);
glVertex2f(0, 0);
glTexCoord2f(1, 1);
glVertex2f(size.width-1, 0);
glTexCoord2f(1, 0);
glVertex2f(size.width-1, size.height-1);
glTexCoord2f(0, 0);
glVertex2f(0, size.height-1);
glEnd();
glPopMatrix();
我已经读过,如果对象大于纹理,OpenGL中的默认模式是重复纹理,但在我的情况下,这不是真的。
修改
加载纹理的代码(我使用了一个库(slick-util)):
texture = TextureLoader.getTexture(textureLocation.substring(0, textureLocation.lastIndexOf('.')), ResourceLoader.getResourceAsStream(textureLocation));
我在设置OpenGL后立即添加了纹理参数,这是正确的吗?
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, WINDOW_WIDTH, 0, WINDOW_HEIGHT, 1, -1);
glMatrixMode(GL_MODELVIEW);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE);
答案 0 :(得分:1)
我的猜测是你正在使用地图集(或spritesheet),并且你的角色被其他精灵包围,导致这些边缘。为防止这种情况发生,您应该在UV坐标上添加一个微小的偏移量。通常四分之一像素将解决所有问题。通过这样做,您应该知道必须考虑纹理的总宽度和高度,因为UV值在范围(0,1)内。因此,将精灵中的所有紫外线抵消这个数量:
x-offset = 1.0 / (textureWidth * 4.0);
y-offset = 1.0 / (textureHeight * 4.0);
答案 1 :(得分:0)
回答Martijin上面的通知:这实际上不是地图集纹理,它足以检查glTexCoord2f,这表明完整的纹理被用作四边形。
此外,没有关于纹理类型的信息。它可能是jpg与一些工件,混合或着色器可以跳过一些纹理值留下瑕疵。
如果是,请尝试使用带有alpha通道的tga或png。
拉伸也可能导致瑕疵。你的glViewport和glOrth一样大吗?
答案 2 :(得分:-1)
您何时设置纹理参数?不知道它是否有帮助,但我倾向于使用以下(它的c,但是对java的翻译应该是直接的)。
glGenTextures(2, node->textures);
GRL2_BindTexture(GL_TEXTURE1, GL_TEXTURE_2D, node->textures[0]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
128, 128, 0, GL_RGB,
GL_UNSIGNED_BYTE, (GLvoid*) node->colorMap);
简而言之,我在创建和绑定纹理之后但在上传之前设置了纹理参数。不知道它是否会有所帮助,但可能会有所帮助。
要检查的另一件事是你的纹理大小。这是2的力量吗?有些图形卡可能比较贴心。