我刚刚开始用java尝试一些OpenGL。我下载了LWJGL和Slick-Util Library。现在我试图在屏幕上绘制一些工作得很好的图像。但我必须遇到大问题:
当我旋转图像并且大约45°时,您可以在角落处看到相同图像的某些位,就像它是具有相同图像的精灵图片一样,可以旋转。
如何缩放图像?它非常小,glScale()函数可以缩放图像本身,但不会缩放它打印的空间。因此,如果图像的大小为16 * 16像素并且我将其放大,我只看到16 * 16像素中缩放图像的一部分
这是我的OpenGL代码:
public class Widget {
String name;
int angle;
public Texture image_texture;
public String image_path ;
public int image_ID;
public int cord_x = 0;
public int cord_y = 0;
static LinkedList<Widget> llwidget = new LinkedList<Widget>();
public Widget(String path){
llwidget.add(this);
image_path = path;
try {
image_texture = TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream(image_path), GL_NEAREST);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
};
image_ID = image_texture.getTextureID();
glEnable(GL_TEXTURE_2D);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glViewport(0,0,Display.getWidth(),Display.getHeight());
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, Display.getWidth(),Display.getHeight(), 0, 1, -1);
glMatrixMode(GL_MODELVIEW);
}
void render(){
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
glTranslatef(0.5f,0.5f,0.0f);
//! Graphics bug
glRotatef(angle,0.0f,0.0f,1.0f);
//
glTranslatef(-0.5f,-0.5f,0.0f);
//! Doesn't work
glScalef(2f, 2f, 2f);
//
glMatrixMode(GL_MODELVIEW);
Color.white.bind();
image_texture.bind();
glBegin(GL_QUADS);
glTexCoord2f(0,0);
glVertex2f(cord_x, Display.getHeight() - cord_y);
glTexCoord2f(1,0);
glVertex2f(cord_x+image_texture.getTextureWidth(),Display.getHeight() - cord_y);
glTexCoord2f(1,1);
glVertex2f(cord_x+image_texture.getTextureWidth(),Display.getHeight() - cord_y+image_texture.getTextureHeight());
glTexCoord2f(0,1);
glVertex2f(cord_x,Display.getHeight() - cord_y+image_texture.getTextureHeight());
glEnd();
}
}
答案 0 :(得分:0)
问题1: 在GL_TEXTURE模式下调用glScalef(2f,2f,2f)会导致四边形内部纹理的缩放,其大小由glVertex2f调用确定。这可能会导致四边形边缘出现不必要的伪影。
问题2: 这个问题的主要问题是当调用glScalef(2f,2f,2f)时,程序不处于允许转换四元坐标的状态。在调用glMatrixMode(GL_TEXTURE)之后,所有后续矩阵运算都会影响纹理矩阵。要获得使用glVertex2f绘制的四边形的缩放效果,您需要在调用glScale2f之前进入GL_MODELVIEW模式。
替代: 使用glVertex2f,您可以确定绘制四边形的坐标。 glVertex2f的参数是绘制顶点的坐标。所以改变这个参数也可以做到这一点。