无法在 OpenGL 中绘制三角形,但其他基元渲染良好

Posted

技术标签:

【中文标题】无法在 OpenGL 中绘制三角形,但其他基元渲染良好【英文标题】:Can't draw triangles in OpenGL but other primitives render fine 【发布时间】:2010-06-24 22:28:53 【问题描述】:

下午好,

我正在尝试学习使用一个使用 OpenGL 的图形库。我可以绘制 2D 图元(文本和线条),但不能渲染 3D 三角形。我已经尝试了所有我能想到的东西,但作为一个 OpenGL 新手,我可能错过了一些明显的东西。

此代码并非旨在提高效率。我正在尝试让它首先工作。

这是启动时的设置:

  // 800 by 600 windows 32 bit depth
  Driver->setDisplay( UDriver::CMode( ScreenWidth, ScreenHeight, 32 ) );
  NL3D::CViewport viewport;
  viewport.initFullScreen();
  Driver->setViewport( viewport );

  NLMISC::CMatrix mtx;
  mtx.identity();
  Driver->setViewMatrix( mtx );
  Driver->setModelMatrix( mtx );

  // screen size is same as pixel resolution
  // CFrustum(float left, float right, float bottom, float top, float znear, float zfar, bool perspective= true)
  Driver->setMatrixMode2D( CFrustum( 0.0f, ScreenWidth, 0.0f, ScreenHeight, -2.0f, 10000.0f, false ) );

这是我的渲染循环中的代码:

static NL3D::CMaterial mat;
mat.initUnlit();
mat.setColor( CRGBA( 255, 255, 0, 128 ) );

float x = 200.0f;
float y = 200.0f;
float width = 200.0f; // (float)ScreenWidth * 0.125f;
float height = 200.0f; // (float)ScreenHeight * 0.125f;
static NL3D::CVertexBuffer vb;
if ( vb.getName().empty() )
   vb.setName("drawBitmap");
vb.setVertexFormat( NL3D::CVertexBuffer::PositionFlag | NL3D::CVertexBuffer::TexCoord0Flag );
vb.setNumVertices( 4 );

   NL3D::CVertexBufferReadWrite vba;
   vb.lock( vba );
   vba.setVertexCoord( 0, NLMISC::CVector( x, 0, y ) );
   vba.setVertexCoord( 1, NLMISC::CVector( x + width, 0, y ) );
   vba.setVertexCoord( 2, NLMISC::CVector( x + width, 0, y + height ) );
   vba.setVertexCoord( 3, NLMISC::CVector( x, 0, y + height ) );
   vba.setTexCoord( 0, 0, 0.f, 1.f );
   vba.setTexCoord( 1, 0, 1.f, 1.f );
   vba.setTexCoord( 2, 0, 1.f, 0.f );
   vba.setTexCoord( 3, 0, 0.f, 0.f );

dynamic_cast<NL3D::CDriverUser*>(Driver)->getDriver()->activeVertexBuffer( vb );

static NL3D::CIndexBuffer pb;
if ( pb.getName().empty() )
   pb.setName("drawBitmap");
pb.setFormat( NL_DEFAULT_INDEX_BUFFER_FORMAT );
pb.setNumIndexes( 6 );

   CIndexBufferReadWrite iba;
   pb.lock( iba );
   iba.setTri( 0, 0, 1, 2 );
   iba.setTri( 3, 2, 3, 0 );


dynamic_cast<NL3D::CDriverUser*>(Driver)->getDriver()->activeIndexBuffer( pb );
dynamic_cast<NL3D::CDriverUser*>(Driver)->getDriver()->renderTriangles( mat, 0, 2 );

有什么建议吗?

谢谢

【问题讨论】:

“我正在尝试学习使用一个使用 OpenGL 的图形库”——也许你应该问的是那个特定的库而不是一般的 OpenGL?适当的标记会为您的问题吸引更多合适的编码人员。 我怀疑有人熟悉它。它是 Ryzome NeL 游戏引擎的一部分。我会试试看。谢谢 【参考方案1】:

原来是多个 OpenGL 上下文。在尝试绘画之前,它并没有让事情退缩。

【讨论】:

请将此标记为“解决方案”以避免此问题被列为“未回答”。

以上是关于无法在 OpenGL 中绘制三角形,但其他基元渲染良好的主要内容,如果未能解决你的问题,请参考以下文章

在 OpenGL 的“原始组装”阶段会发生啥

OpenGL不使用纹理渲染

C++ OpenGL/Glut 无法绘制

OpenGL 忽略四边形并将它们变成三角形

无法在opengl中绘制多个对象

3.OpenGL渲染技巧