1

私は OpenGL ES を学んでいます。カメラの位置などの背後にある基本的な行列ロジックを理解して、いくつかの立方体を正常に描画しました。現在、VBO の例を作成しようとしていますが、画面には何も描画されません。コードを貼り付けます。おそらく誰かが私が間違っていることに気付くでしょう。

フラグメント シェーダー コード

precision mediump float;
varying vec2 v_texCoord;
varying vec3 v_colour; 
uniform sampler2D s_texture;    
void main() 
{ 
 gl_FragColor = texture2D(s_texture, v_texCoord);
}

頂点シェーダー

attribute vec3 av3position;
attribute vec2 a_texCoord; 
attribute vec3 av3colour;

uniform mat4 PerspectiveMatrix;
uniform mat4 ModelViewMatrix;

varying vec2 v_texCoord; 
varying vec3 v_colour;

void main() 
{ 
v_texCoord = a_texCoord; 
v_colour =av3colour;
vec4 pos = ModelViewMatrix * vec4(av3position,1.0);
gl_Position = PerspectiveMatrix * pos;
}

テクスチャの読み込み

Texture01RGBA->boLoadTextureFromfile("BitmapData/cubeLayout_02.png" );

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);         // Use tightly packed data
glGenTextures(1, &gluiTextureID);              // Generate a texture object
glBindTexture(GL_TEXTURE_2D, gluiTextureID);   // Bind the texture object
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Texture01RGBA->getWidth(), Texture01RGBA->getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, Texture01RGBA->getPixmapPointer()); 
glGenerateMipmap(GL_TEXTURE_2D);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);     
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glActiveTexture ( GL_TEXTURE0 );
glBindTexture ( GL_TEXTURE_2D, gluiTextureID );
// Set the sampler texture unit to 0
glUniform1i ( iLoc2DSampler, 0 );

頂点オブジェクトの構造

const float aCubeVertices[] =
{ // x, y, z, nx, ny, nz, u, v
 1.000000,1.000000, 1.000000, 0.000000, 0.000000, 1.000000, 0.500000, 0.500000,
 1.000000,1.000000, 1.000000, 0.000000, 0.000000, 1.000000, 0.500000, 0.250000,
-1.000000,1.000000, 1.000000, 0.000000, 0.000000, 1.000000, 0.250000, 0.250000,
-1.000000,1.000000, 1.000000, 0.000000, 0.000000, 1.000000, 0.250000, 0.500000,
 1.000000,1.000000, 1.000000, 0.000000, 0.000000, 1.000000, 0.500000, 0.750000,
-1.000000,1.000000, 1.000000, 0.000000, 0.000000, 1.000000, 0.250000, 0.750000,
-1.000000,1.000000, 1.000000, 0.000000, 0.000000, 1.000000, 0.250000, 1.000000,
 1.000000,1.000000, 1.000000, 0.000000, 0.000000, 1.000000, 0.500000, 1.000000,
 1.000000,1.000000, 1.000000, 1.000000, 0.000000, 0.000000, 0.750000, 0.250000,
 1.000000,1.000000, 1.000000, 1.000000, 0.000000, 0.000000, 0.750000, 0.000000,
 1.000000,1.000000, 1.000000, 1.000000, 0.000000, 0.000000, 0.500000, 0.000000,
 1.000000,1.000000, 1.000000, 1.000000, 0.000000, 0.000000, 0.500000, 0.250000,
 1.000000,1.000000, 1.000000, 0.000000, 1.000000, 0.000000, 0.500000, 0.250000,
 1.000000,1.000000, 1.000000, 0.000000, 1.000000, 0.000000, 0.500000, 0.000000,
-1.000000,1.000000, 1.000000, 0.000000, 1.000000, 0.000000, 0.250000, 0.000000,
-1.000000,1.000000, 1.000000, 0.000000, 1.000000, 0.000000, 0.250000, 0.250000,
-1.000000,1.000000, 1.000000, 1.000000, 0.000000, 0.000000, 0.250000, 0.250000,
-1.000000,1.000000, 1.000000, 1.000000, 0.000000, 0.000000, 0.250000, 0.000000,
-1.000000,1.000000, 1.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000,
-1.000000,1.000000, 1.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.250000,
 1.000000,1.000000, 1.000000, 0.000000, 1.000000, 0.000000, 0.500000, 0.750000,
 1.000000,1.000000, 1.000000, 0.000000, 1.000000, 0.000000, 0.500000, 0.500000,
-1.000000,1.000000, 1.000000, 0.000000, 1.000000, 0.000000, 0.250000, 0.500000,
-1.000000,1.000000, 1.000000, 0.000000, 1.000000, 0.000000, 0.250000, 0.750000
};

unsigned short aCubeIndices[]= // 36 Elements. 3 Groups
{  0,1,2,0,2,3,4,5,6,4,6,7,8,9,10,8,10,11,12,13,14,12,14,15,16,17,18,16,18,19,20,21,22,20,22,23 };

VBOの作成

glGenBuffers (1, &vao);
glBindBuffer  (GL_ARRAY_BUFFER, vao);

glBufferData(GL_ARRAY_BUFFER, 24 * sizeof(float)*8, aCubeVertices, GL_STATIC_DRAW);
glBindBuffer (GL_ARRAY_BUFFER, 0);

glGenBuffers(1, &vinx);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vinx);

glBufferData(GL_ELEMENT_ARRAY_BUFFER, 36* sizeof(GLushort), aCubeIndices, GL_STATIC_DRAW);
glBindBuffer (GL_ELEMENT_ARRAY_BUFFER, 0);

VBO 図面

glBindBuffer  (GL_ARRAY_BUFFER, vao);
  // set up vertex attributes
  glEnableVertexAttribArray(iLocPosition);
  glEnableVertexAttribArray(iLocTexCoord);
  glVertexAttribPointer(iLocPosition, 3, GL_FLOAT, GL_FALSE, sizeof(float)*8, 0);
  glVertexAttribPointer(iLocTexCoord, 2, GL_FLOAT, GL_FALSE, sizeof(float)*8,  (const void *)24  );
  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vinx);
  glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_SHORT, (void*)0);
  glBindBuffer(GL_ARRAY_BUFFER, 0);
  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
  glDisableVertexAttribArray(iLocPosition);
  glDisableVertexAttribArray(iLocTexCoord);

前に指摘したように、以前に行ったより単純な例 (テクスチャ、変換行列) と基本的に同じコードを使用してきました。エラーもチェックしましたが、コードエラーはありません。

誰かが私のコードで何が問題なのかを強調していただければ幸いです。

4

2 に答える 2

0

頂点バッファー (または少なくともインデックス バッファー) が正しくないようです。たとえば、最初の三角形は、次の頂点に対応するインデックス 0、1、2 によって定義されます。

 1.000000,1.000000, 1.000000, 0.000000, 0.000000, 1.000000, 0.500000, 0.500000,
 1.000000,1.000000, 1.000000, 0.000000, 0.000000, 1.000000, 0.500000, 0.250000,
-1.000000,1.000000, 1.000000, 0.000000, 0.000000, 1.000000, 0.250000, 0.250000,

ご覧のとおり、1 番目と 2 番目の頂点の位置は同じ (1,1,1) です。結果は、レンダリングできない縮退した三角形 (領域のない三角形) になります。

于 2012-10-29T20:38:33.117 に答える
0

ここに示すコードは正しいようです。問題は、コードの他の部分にある可能性があります。エラーの原因の 1 つは、モデル ビューとパースペクティブ マトリックスの設定方法にある可能性があります。もう 1 つは、ユニフォーム glUniform*() の設定方法に問題がある可能性があります (おそらく、マトリックスとの行/列の過半数の不一致と、OpenGL がそれを期待する方法)。そのコードを貼り付けることができれば、完全な図が得られます。立方体の頂点とインデックスのデータは正しいと思います。以前に立方体を描画したと述べたからです。

于 2013-05-07T10:56:46.257 に答える