2016-09-29 67 views
0

這是一個賦值,我需要使用OpenGL渲染線條,但僅使用GL_POINTSOpenGL:僅使用GL_POINTS渲染線條

我正在與一個水平線P1測試它(-1,-1)P2(1,-1)

我的函數使用線函數y = MX + C:

void line2(double x1, double y1, double x2, double y2, double precision, int r, int g, int b){ 


double m = 0.0;    // slope 
double c = (y1 - m*x1);  // constant 
double j = y1;    // starting y value 

// check division by 0 
if (x2-x1 == 0) 
    m = 0; 
else 
    m = (y2-y1)/(x2-x1); 

glColor3f(r,g,b); 

glBegin(GL_POINTS); 
    for (double i = x1; i < x2; i+=precision){ 
     j = m*i + c;  // result of y from line function 
     glVertex2f(i,j); 
    } 
glEnd(); 

}

與調用它:

line2(-1,-1,1,-1,0.000001, 102, 102, 255); 

給了我一個水平虛線。這不是連續的。如果我添加更多的精度,我的程序可能由於內存而掛起。

更新:我現在注意到的是,呈現多行,第一個是虛線!所以如果我多次調用line(),不管參數如何,第一行總是點綴而其他行都是完美的。

是否有更好的方法(公式或循環)來渲染一條線?

謝謝!

+0

嘗試使用多個繪製調用(但讓他們小,例如<40)。將頂點創建拆分爲塊(頂點數量/ 40)併發出每個問題的繪製調用。 在OpenGL中3.3+,你主要通過頂點緩衝區和着色器做到這一點,你也許可以做到folling: 1.提交你的起點和終點通過頂點緩衝區 2.呼叫幾何着色器添加額外的頂點。將精度作爲統一變量傳遞(用於將內存從CPU推送到GPU)。 3.渲染:) – somnium

+0

您應該先創建一個向量值,然後將它們作爲頂點屬性傳遞 – Charlie

+0

也可以避免每次計算'j',因爲j的增量也是常量: 'double jInc = m * precision' 然後改變你的循環: 'for(double i = x1,j = y1; i JMA

回答

1
double m = 0.0;    // slope 
double c = (y1 - m*x1);  // constant 
double j = y1;    // starting y value 

// check division by 0 
if (x2-x1 == 0) 
    m = 0; 
else 
    m = (y2-y1)/(x2-x1); 

你計算cm==0,所以c總是等於j。在計算m之後,嘗試將c的計算移動到一行。

另外,當x2-x1 == 0時,斜率應該是正的或負的無窮大,而不是0.由於inf很難處理,因此可能需要特殊情況才能繪製垂直線。

至於其他的方式來從像素畫線,你不能去錯布氏線:https://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm

+0

哦,你是對的計算c太早。我們瞭解到Bresenham繪製直線水平/垂直線效率不高。因此,試圖用普通的舊線路功能來做到這一點。 我現在注意到的是,如果我繪製了2行,第一行就是虛線!所以如果我多次調用line(),不管參數如何,第一行總是點綴而其他行都是完美的。 – OverAir