我有一個QGraphicsScene,其中添加了一個QGraphicsItem。在QGraphicsItem中,我渲染了OpenGL ES 2.0的hello三角形示例中使用的三角形。問題是,如果我創建並編譯除QGraphicsItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
函數以外的着色器,它們不會被編譯。我知道你應該有一個GL渲染上下文激活,但是當我將視口設置爲GLWidget時不會發生?我嘗試過在QGraphicsItem構造函數或QGraphicsScene中編譯它們,並將QGraphicsItem設置爲父項(我知道它們是非常愚蠢的事情),但是(顯然)沒有任何效果。對我來說最合乎邏輯的是在QGraphicsItem類中創建一個initShaders()函數,然後在我的場景中創建該項目後調用它,但那也行不通。爲QGraphicsItem創建着色器程序
1
A
回答
2
創建QGraphicsView的派生類。覆蓋setupViewport(QWidget *視口)以初始化着色器。這將允許您在編譯着色器時確保上下文是最新的。但是,它要求在圖形視圖上調用setViewport()之前將項目添加到場景中。
void MyGraphicsView::setupViewport(QWidget *viewport)
{
QGLWidget *glWidget = qobject_cast<QGLWidget*>(viewport);
if (glWidget) {
glWidget->makeCurrent();
foreach (QGraphicsItem *item, scene()->items())
{
MyGraphicsShaderItem *glItem = qgraphicsitem_cast<MyGraphicsShaderItem*>(item);
if (glItem)
glItem->initShader();
}
glWidget->doneCurrent();
}
}
相關問題
- 1. 創建着色器語言
- 2. 創建D3DX着色器
- 3. 創建着色器文件
- 4. 的Android/OpenGLES2 - 在不同的線程創建「着色器」程序
- 5. 使用VS2012着色器設計器創建XNA着色器
- 6. 着色器程序到節點+片段着色器
- 7. OpenGL着色器沒有鏈接着色器程序
- 8. 在Cgfx中創建斜坡着色器
- 9. 錯誤創建着色器類型35663
- 10. 如何創建着色器GLES2
- 11. WebGL着色器創建問題
- 12. 着色器創建曲線紋理
- 13. OpenGL程序/着色器未初始化
- 14. GLSurfaceView.Renderer - 動態更改着色器程序
- 15. WebGL中的開關着色器程序
- 16. webgl替換程序着色器
- 17. GLSL着色器加載程序問題
- 18. OpenGL:爲着色器創建代理用戶
- 19. 着色器附件錯誤。無論是無效的程序或着色器
- 20. 我可以在WPF中創建運動着色像素着色器嗎?
- 21. QGraphicsItem沿着路徑移動
- 22. Java圖形着色程序
- 23. 瞭解着色器編程
- 24. Jogl着色器編程
- 25. 包含着色器的着色器?
- 26. 將表面着色器轉換爲片段着色器
- 27. CSS爲容器着色
- 28. GLSL:頂點着色器無片段着色片段着色器
- 29. 奇怪的幾何着色器程序行爲... GLSL
- 30. 爲Windows Store DirectX應用程序實現着色器動畫
:-)謝謝,謝謝,謝謝!我並沒有真正做到這一點,但你給了我一個想法,我寫道: 'int main(int argc,char * argv []){ QApplication a(argc,argv); GraphicsScene gScene; GraphicsView視圖; QGLWidget * myWidget = new QGLWidget(QGLFormat(QGL :: SampleBuffers)); view.setViewport(myWidget); myWidget-> makeCurrent(); myGraphicsItem * triangle = new myGraphicsItem(); triangle-> initShaders(); gScene.addItem(triangle); view.setScene(&gScene); view.showMaximized(); return a.exec(); }' 它工作!再次感謝你! – Sassa 2011-06-16 23:25:50
我在我的QGraphicsItem中仍然有initShaders(),但是這次我在'view.setViewport(myWidget)之後調用它。 myWidget-> makeCurrent();'而不是之前。哦,愚蠢 – Sassa 2011-06-16 23:35:18