跳轉到內容

OpenGL 程式設計/除錯

來自華夏公益教科書

如果您使用的是 Mesa OpenGL 實現,您可以設定以下環境變數

  • LIBGL_ALWAYS_SOFTWARE=1 : 使用軟體實現,完全不使用圖形卡。當您
    • 懷疑驅動程式中的錯誤時,
    • 想要嘗試另一種實現(就像使用不同的圖形卡一樣),
    • 想要檢查圖形故障是由於記憶體未初始化還是程式設計錯誤造成的。
  • MESA_DEBUG=1 : 在錯誤情況下會輸出診斷訊息(例如,在程式未連結時分配統一變數)。

另請參閱 Mesa 的 除錯環境變數 頁面。

常見錯誤

[編輯 | 編輯原始碼]

如果您手動繪製線條或三角形,但沒有任何顯示

  • 檢查您的第四個座標是否為 1 而不是 0
  • 檢查您是否正確設定了 glEnableVertexAttribArray / glBindBuffer / glVertexAttribPointer
  • 仔細檢查您使用的變數是否正確(錯誤的複製貼上...) - 避免使用全域性變數以幫助解決此問題
  • 仔細檢查您的 glUniform* 呼叫,包括型別 (3fv, 4fv...) - OpenGL 非常嚴格 並且 不會發出任何提示
  • 注意 glDrawElements 的第四個也是最後一個引數 (indices) 是指從起始位置偏移的位元組數,而不是從起始位置開始的元素數量,即使在使用 IBO 時也是如此。

錯誤報告

[編輯 | 編輯原始碼]

OpenGL 使用 glGetError() 來報告錯誤。

	switch (glGetError()) {
	case GL_NO_ERROR:
		cerr << "GL_NO_ERROR" << endl;
		break;
	case GL_INVALID_ENUM:
		cerr << "GL_INVALID_ENUM" << endl;
		break;
	case GL_INVALID_VALUE:
		cerr << "GL_INVALID_VALUE" << endl;
		break;
	case GL_INVALID_OPERATION:
		cerr << "GL_INVALID_OPERATION" << endl;
		break;
	case GL_INVALID_FRAMEBUFFER_OPERATION:
		cerr << "GL_INVALID_FRAMEBUFFER_OPERATION" << endl;
		break;
	case GL_OUT_OF_MEMORY:
		cerr << "GL_OUT_OF_MEMORY" << endl;
		break;
	}

模板緩衝區

[編輯 | 編輯原始碼]

有關如何除錯模板緩衝區的提示,您可以檢視 模板緩衝區 部分。

< OpenGL 程式設計

瀏覽和下載 完整程式碼
華夏公益教科書