Для школьного проекта я вызываю функцию JOGL glVertex2f(x, y)
в цикле, чтобы построить один пиксель за раз, чтобы нарисовать линию.Я понимаю, что это странный способ использовать JOGL, но смысл в том, чтобы реализовать алгоритм рисования линий.
Перед началом цикла я звоню var3.glBegin(GL.GL_LINE_LOOP)
.Другие параметры, которые я пытался передать на glBegin()
, привели к тому, что пиксели не активировались.
Мой код выдает точные линии, но интенсивность пикселей уменьшается от начала до конца.Можете ли вы определить проблему и сказать мне, какие изменения мне нужно внести в этот код, чтобы каждый пиксель в строке отображался с полной интенсивностью?
public class LineScanConverter {
public static void main (final String args[]) {
final GLProfile glprofile = GLProfile.getDefault();
final GLCapabilities glcapabilities = new GLCapabilities( glprofile );
final GLCanvas glcanvas = new GLCanvas( glcapabilities );
glcanvas.addGLEventListener( new GLEventListener() {
@Override
public void reshape(GLAutoDrawable glautodrawable, int x, int y, int width, int height ) {
LineRenderer.setup( glautodrawable.getGL().getGL2(), width, height );
}
@Override
public void init( GLAutoDrawable glautodrawable ) {
}
@Override
public void dispose( GLAutoDrawable glautodrawable ) {
}
@Override
public void display( GLAutoDrawable glautodrawable ) {
LineRenderer.renderLine(glautodrawable.getGL().getGL2(), 3, 7, 337, 553);
}
});
final Frame frame = new Frame( "Line Scan Converter" );
frame.add( glcanvas );
frame.addWindowListener( new WindowAdapter() {
public void windowClosing( WindowEvent windowevent ) {
frame.remove( glcanvas );
frame.dispose();
System.exit( 0 );
}
});
frame.setSize( 640, 480 );
frame.setVisible( true );
}
}
public class LineRenderer {
public static void setup(GL2ES1 var0, int var1, int var2) {
var0.glMatrixMode(5889);
var0.glLoadIdentity();
GLUgl2es1 var3 = new GLUgl2es1();
var3.gluOrtho2D(0.0F, (float)var1, 0.0F, (float)var2);
var0.glMatrixMode(5888);
var0.glLoadIdentity();
var0.glViewport(0, 0, var1, var2);
}
public static void renderLine(GL2ES1 var0, int x0, int y0, int x1, int y1) {
var0.glLoadIdentity();
ImmModeSink var3 = ImmModeSink.createFixed(9, 3, 5126, 3, 5126, 0, 5126, 0, 5126, 35044);
var3.glBegin(GL.GL_LINE_LOOP);
var3.glColor3f(1.0F, 0.0F, 0.0F);
float dx = x1 - x0;
float dy = y1 - y0;
for (float i = 0; i <= (dx - 1); i++) {
float x = x0 + i;
float y = ((dy / dx) * i) + y0;
y = Math.round(y);
var3.glVertex2f(x, y);
}
var3.glEnd(var0, true);
}
}