簡體   English   中英

我的glOrtho怎么了? 負零而不是零

[英]What's wrong with my glOrtho? Negative zero instead of zero

我正在為OpenGL應用程序實現自己的矩陣數學。 到目前為止,雖然困難,但情況基本上還不錯。 我最近的問題是我對glOrtho()的實現,我對得到一種解釋或向我指出的具體問題沒有多大的運氣。

具體來說,我的版本導致matrix [14]元素為負零。 (-0.000000),而我使用棄用的glOrtho()后來自OpenGL的glGet()版本是正常零。 (0.000000)

我不知道這是否會影響任何事情,但是我對數學不匹配感到不安。

glOrtho的OpenGL規范,以供參考,我相信我已經正確地遵循了它,並且為以下內容正確地進行了數學運算: http : //www.opengl.org/sdk/docs/man/xhtml/glOrtho.xml

我自己的glOrtho函數:

vec_t* Utils::OrthoMatrix(vec_t* out_matrix, const vec_t& left, const vec_t& right, const vec_t& bottom, const vec_t& top, const vec_t& znear, const vec_t& zfar)
{
    memcpy(out_matrix, zeroMatrix, 16*sizeof(vec_t));

    out_matrix[0] = 2.0f / (right - left);
    out_matrix[5] = 2.0f / (top - bottom);
    out_matrix[10] = -2.0f / (zfar - znear);
    out_matrix[12] = -((right + left) / (right - left));
    out_matrix[13] = -((top + bottom) / (top - bottom));
    out_matrix[14] = -((zfar + znear) / (zfar - znear));
    out_matrix[15] = 1.0f;

    return out_matrix;
}

我的調整大小功能(為便於閱讀而大幅縮減):

void GameLogic::OnResize(int width, int height) // For purposes of this test, width = 640, height = 480.
{
    if(height == 0) // Avoid potential divide-by-zero
        height = 1;

    glViewport(0, 0, width, height);

    Utils::OrthoMatrix(m_orthoMatrix, 0.0f, (GLfloat)width, (GLfloat)height, 0.0f, -100.0f, 100.0f);

    // Setup fixed function OpenGL to compare against.
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0f, (GLfloat)width, (GLfloat)height, 0.0f, -100.0f, 100.0f);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}
void GameLogic::Render() // Drastically cut down to illustrate issue.
{
    vec_t modelviewmatrix[16], projectionmatrix[16];
    glGetFloatv(GL_MODELVIEW_MATRIX, modelviewmatrix);

    glGetFloatv(GL_PROJECTION_MATRIX, projectionmatrix);
/*
    At this point, projectionmatrix and m_orthoMatrix are identical, 
    except in the matrix[14] element, which is 0.000000 for projectionmatrix, 
    and -0.000000 for m_orthoMatrix.
*/
}

我不太清楚為什么會這樣,或者它會產生什么影響? 據我所知,該數學運算正確無誤,因此它應為負零,而OpenGL返回正零。 到目前為止,我最好的猜測是某種駕駛員怪癖,其中駕駛員正在偽造數字以避免負零? 我已經在兩個獨立的nVidia GPU上測試了此代碼,並獲得了相同的結果。 也無權使用ATI或類似產品進行測試。

免責聲明:盡管規范確實規定允許使用負值,但我對glOrtho的近和遠值如何工作一無所知。

我應該使用單位矩陣來初始化投影矩陣,還是將單位矩陣乘以透視矩陣? 我不需要...認為我需要這樣做,而我的glFrustum實現似乎在不這樣做的情況下就可以正常工作,但是也許就是這樣嗎? 我對數學不太了解,無法知道是否應該這樣做以確保正確性。

關於我做錯或誤解的任何想法,有人嗎? 或者,如果我確實發現了某種奇怪的怪癖? 如果建議最好的方法是僅使用它,而不是嘗試根據我目前所獲得的值進行調整,那么對使用負零的影響(如果有的話)的解釋也是有好處的。

CPU和GPU內部的浮點精度不一定相同,因此可以預期會有很小的差異。

不要嘗試“修復”它-您的代碼可以正常工作。 我認為“奇怪的怪癖”很好地涵蓋了它。

將零加到除零以外的任何值上(這是矩陣乘法的結果),得出的結果完全相同; 這甚至不算是重大差異。

而且,實際上,您應該期望在比較兩個計算相同標稱結果的不同浮點過程時會遇到差異。 浮點數並不精確,因此您做任何不同的操作(例如,更改加法順序)都可能會產生稍微不同的結果。 因此,每當比較浮點結果時,都需要指定一個公差。

負零和正零在數學上是相同的浮點值。 它們不相等 ,但是根據IEEE-754,您會得到相同的結果。

您根本不應該嘗試將相等性與其他浮點計算進行匹配。 如果需要檢查矩陣數學,則至少要針對一個范圍(正負一些小數)進行測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM