2013-07-02 3 views
0

Я хочу нарисовать простую линию. Поэтому у меня есть этот код, как показано ниже. Но когда я запускаю код, я ничего не вижу в форме.Рисование строки в OpenGL

public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
      drawLine(); 
     } 

     private void drawLine() { 
      GL.glClear(GL.GL_COLOR_BUFFER_BIT); 
      GL.glBegin(GL.GL_LINES); 
      GL.glVertex3f(100.0f, 100.0f, 0.0f); // origin of the line 
      GL.glVertex3f(200.0f, 140.0f, 5.0f); // ending point of the line 
      GL.glEnd(); 
     } 
    } 

Что мне делать?

+0

Если предположить, что код, который вы разместили весь код у вас есть, вы теряете много, как создание OpenGL окна/контекста, настройки просмотра, а также указав матрицу проекции. Вы должны прочитать это немного больше и изучить некоторые учебники OpenGL. OpenGL не будет магически работать с winforms, как это. –

+0

Даже если бы все это работало, и вы могли бы нарисовать форму, у вас все равно будет проблема с вашей линией, находящейся далеко за пределами диапазона координат нормализованных устройств, что [-1, 1] во всех трех осях , –

+0

Да, это единственный код, который у меня есть до сих пор. Думаю, мне нужно читать намного больше. спасибо –

ответ

2

Состояние OpenGL по умолчанию предполагает размер видового экрана, который равен размеру окна, к которому впервые был привязан контекст. Все матрицы являются тождественными. Таким образом, вы эффективно рисуете пространство так называемых нормализованных координат устройства (NDC). В этом пространстве видимый видовой экран имеет диапазон координат [-1; 1] в любом направлении.

Ваш наивный код предполагает, что позиции вершин должны быть в единицах пикселей. Однако все вне диапазона [-1; 1] находится за пределами экрана, а ваши «координаты пикселей» находятся вне видимого окна просмотра. Вам нужно установить видовое окно и проекцию так, чтобы они соответствовали вашему размеру окна, если вы хотите использовать пиксели в качестве единиц координат.

private void drawLine() { 
     GL.glViewport(0, 0, window_width, window_height); 

     GL.glMatrixMode(GL_PROJECTION); 
     GL.glLoadIdentity(); 
     GL.glOrtho(0, window_width, 0, window_height, -1, 1); 

     GL.glMatrixMode(GL_MODELVIEW); 
     GL.glLoadIdentity(); 

     GL.glClear(GL.GL_COLOR_BUFFER_BIT); 
     GL.glBegin(GL.GL_LINES); 
     GL.glVertex3f(100.0f, 100.0f, 0.0f); // origin of the line 
     GL.glVertex3f(200.0f, 140.0f, 5.0f); // ending point of the line 
     GL.glEnd(); 

     GL.glFlush(); 

     this.SwapBuffer(); // if the form doesn't automatically swap 
    } 
Смежные вопросы