1

最後に、モデルローダーが機能するようになりました(以前の質問に基づいています)。すべての値を正常に保存し、glDrawElemts を正常に実行しますが、glDrawArrays は実行しません。

ええ、あなたが最初に言うことは、「glDrawArrays は明らかに正しく書き出されていない」ということです。それが問題です - 私は 99% 確信しています。

コードは次のとおりです。

bool modelLoader(string fileName,vector<GLfloat>& vertices, vector<GLushort>& indices)
{
fstream objFile;
vector<GLfloat> localVertices;
string dataLine;
stringstream mystream;
GLfloat x, y, z;
GLushort ind1, ind2, ind3;
char c, d; 
vertices.clear();
indices.clear();

for (int i = 0; i < 3; i++)
{
    vertices.push_back(0);
}


for (int i = 0; i < 3; i++)
{
    localVertices.push_back(0);
}


objFile.open(fileName);
if (!objFile.good())
{
    printf("Error with loader");
    return false; 
}

while (!objFile.eof())
{
    getline(objFile, dataLine);
    if (dataLine == "") 
    {                                                                  
        mystream.clear();                                              
        continue;                                                      
    }                                                                  
    mystream.clear();                                                  
    mystream.str(dataLine);                                            
    c = dataLine[0];                                                   
    d = dataLine[1];
    mystream.ignore(2);
    switch (c)
    {
    case 'v':
        {
            switch (d)
            {
            case 'n':
                { /* for normals */ break;}
            case ' ':
                mystream >> x >> y >> z;
                localVertices.push_back(x);
                localVertices.push_back(y);
                localVertices.push_back(z);
                printf("\nVertices: %f, %f, %f", x, y, z);
                break;
            default:
                {break;}
            }                                                                                                    
            break;                                                                                               
        }                                                                                                        
    case 'f':                                                                                                    
        {                                                                                                        
            //printf("F entered");                                                                               
            mystream >> ind1 >> ind2 >> ind3;                                                                    
            vertices.push_back(localVertices[ind1* 3 + 0]);                                                      
            vertices.push_back(localVertices[ind1* 3 + 1]);                                                      
            vertices.push_back(localVertices[ind1* 3 + 2]);                                                      
            vertices.push_back(localVertices[ind2* 3 + 0]);                                                      
            vertices.push_back(localVertices[ind2* 3 + 1]);                                                      
            vertices.push_back(localVertices[ind2* 3 + 2]);                                                      
            vertices.push_back(localVertices[ind3* 3 + 0]);                                                      
            vertices.push_back(localVertices[ind3* 3 + 1]);                                                     
            vertices.push_back(localVertices[ind3* 3 + 2]);
            indices.push_back(ind1);
            indices.push_back(ind2);
            indices.push_back(ind3);
            printf("\nIndices: %d, %d, %d", ind1, ind2, ind3);
            break;
        }
    case !'v' || !'f':
        {
            break;
        }
    default:
        {break;}
    }
    mystream.clear();
}
objFile.close(); 
return true;
 }

ここから、メイン関数で次のように呼び出します。

vector<GLfloat> vertices;

vector<GLushort> indices;


if (!modelLoader("triangles.obj", vertices, indices))
{
    cout << "FAILED TO RUN: MODEL LOADER";

    return 1;
}

モデル ビュー マトリックスの設定、ループを実行してすべての反復を更新することについて、他の多くの悪意を挿入します...

int size = vertices.size()-3;

glDrawArrays(GL_TRIANGLES, 3, (GLsizei)size);

ああ、triangles.obj ファイルは次のとおりです。

v -10.0 10.0 10.0
v -10.0 -10.0 10.0
v 10.0 -10.0 10.0
v 10.0 10.0 10.0
v 20.0 10.0 10.0
v 20.0 -10.0 10.0
f 1 2 3
f 4 5 6

喜びがまったくない。前述したように、DrawElements を使用すると問題なく動作しますが、他の .obj ファイルを描画しようとすると例外エラーが発生します。

どこが間違っているかの手がかりはありますか?

4

1 に答える 1

0

最初の三角形を描かないつもりですか?すべての三角形を描画するための適切な呼び出しは、次のようにする必要があります。その前に、呼び出しを有効にして、とglDrawArrays(GL_TRIANGLES, 0, (GLsizei)vertices.size());によって配列を設定する必要もあります。必要に応じて、色や法線などの他の属性についても同じです。ところで、OpenGL 3.0以降、これらはすべて非推奨になっているため、始めたばかりの場合は、代わりにコア3.0APIを学習することをお勧めします。glEnableClientState(GL_VERTEX_ARRAY)glVertexPointer()

于 2013-02-07T19:04:24.963 に答える