2016-04-06 6 views
2

からクリップさまたはそれ以下のものは、私はクリッピングを起こさない。 これは、位置とインデックスを埋めるために私のコードです:OpenGLの頂点は、このアルバムに示したように、私は私の頂点が縁取られた上でクリップしたよ側

void Terrain::fillPosition() 
{ 
    //start from the top right and work your way down to 1,1 
    double x = -1, y = 1, z = 1; 
    float rowValue = static_cast<float>((1.0f/_rows) * 2.0); // .05 if 40 
    float colValue = static_cast<float>((1.0f/_columns) * 2.0); // .05 if 40 

for (y; y > -1; y -= colValue) 
{ 
    for (x; x < 1; x += rowValue) 
    { 
     _vertexPosition.emplace_back(glm::vec3(x, y, z)); 
    } 
    x = -1; 
} 
} 

このきちんと自分の位置を設定し、私はGL_POINTSでそれをテストしてみました。それは400x400と40x40、およびその間の他の値で正常に動作します。 インデックスコード:

void Terrain::fillIndices() 
{ 
    glm::ivec3 triangle1, triangle2; 
    for (int y = 0; y < _columns - 1; y++) 
    { 
     for (int x = 0; x < _rows - 1; x++) 
     { 
      // Triangle 1 
      triangle1.x = x  + y  * _rows; 
      triangle1.y = x  + (y + 1) * _rows; 
      triangle1.z =(x + 1) + y  * _rows; 
      // Triangle 2 
      triangle2.x = triangle1.y; 
      triangle2.y = (x + 1) + (y + 1) * _rows; 
      triangle2.z = triangle1.z; 

      // add our data to the vector 
      _indices.emplace_back(triangle1.x); 
      _indices.emplace_back(triangle1.y); 
      _indices.emplace_back(triangle1.z); 

      _indices.emplace_back(triangle2.x); 
      _indices.emplace_back(triangle2.y); 
      _indices.emplace_back(triangle2.z); 
     } 
    } 
} 

_indices ::これを引き起こしているかわからvector.I'm STDではありません、しかし、私はそれが私がメッシュのためのインデックスを埋めるよ道だと確信しています。私はアルゴリズムを書き直しましたが、同じ結果が得られます。小さい値は完全にうまく動作し、〜144を超える大きな値は切り捨てられます。私はこのように私のバッファを埋める:

void Terrain::loadBuffers() 
{ 
    // generate the buffers and vertex arrays 
    glGenVertexArrays(1, &_vao); 
    glGenBuffers(1, &_vbo); 
    glGenBuffers(1, &_ebo); 
    // bind the vertex array 
    glBindVertexArray(_vao); 
    // bind the buffer to the vao 
    glBindBuffer(GL_ARRAY_BUFFER, _vbo); 
    glBufferData(GL_ARRAY_BUFFER, _vertexPosition.size() * sizeof(_vertexPosition[0]), _vertexPosition.data(), GL_STATIC_DRAW); 

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _ebo); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, _indices.size() * sizeof(_indices[0]), _indices.data(), GL_STATIC_DRAW); 
    // enable the shader locations 
    glEnableVertexAttribArray(0); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, nullptr); 
    // unbind our data 
    glBindVertexArray(0); 
} 

と私のドローコール:

void Terrain::renderTerrain(ResourceManager& manager, ResourceIdTextures id) 
{ 
    // set the active texture 
    glActiveTexture(GL_TEXTURE0); 
    // bind our texture 
    glBindTexture(GL_TEXTURE_2D, manager.getTexture(id).getTexture()); 
    _shaders.use(); 
    // send data the our uniforms 
    glUniformMatrix4fv(_modelLoc, 1, GL_FALSE, glm::value_ptr(_model)); 
    glUniformMatrix4fv(_viewLoc, 1, GL_FALSE, glm::value_ptr(_view)); 
    glUniformMatrix4fv(_projectionLoc, 1, GL_FALSE, glm::value_ptr(_projection)); 
    glUniform1i(_textureLoc, 0); 
    glBindVertexArray(_vao); 
    // Draw our terrain; 
    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); 
    glDrawElements(GL_TRIANGLES, _indices.size(), GL_UNSIGNED_INT, 0); 
    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); 
    glBindVertexArray(0); 
    _shaders.unuse(); 
} 

私はそれがモデルにあるため、私の変換のだと思ったので、私はすべての変換を削除し、それが同じ結果です。 glm :: vec3 to_stringをキャストしてデバッグしようとしましたが、データが正常に表示されました。私のprojectionMatrixは

glm :: perspective(glm :: radians(_fov)、_aspRatio、0.1f、1000.0f)です。

私はそれが私の視点でクリッピングを行っているのか疑問に思っています。 _aspRatioは16/9です。

小さな行xx列ではうまく動作し、大きなものではないというのは本当に奇妙です。問題の内容がわかりません。

答えて

2

私は_vertexPositionの長さをチェックします。私はあなたの内側のループの末尾に余分なポイントを生成する(_rowsの数に応じて)問題があると思われます(そして外側のループも_columnsによる)。

なぜなら、頂点ループの終了条件は浮動小数点演算の正確な動作によって決まるからです。具体的には、範囲[-1,1]を_rows個のセグメントに分割してそれらを加算し、それらを終了テストとして使用します。最終点(内部ループあたり_rows+1点を生成するかどうか)を期待するかどうかは不明です([-1,1]の範囲全体をカバーしない矩形を生成する)かどうかは不明です。残念ながら、浮動小数点は正確ではないので、これは信頼できない動作のためのレシピです。浮動小数点エラーの方向によっては、どちらか一方が発生する可能性があります。

_rowsの数値が大きいほど、同じ初期値に多くの(そしてかなり小さい)数値が追加されます。これはあなたの浮動小数点エラーを悪化させます。

いずれにしても、信頼性の高い動作を得るには、ループ終了を判断するために整数ループ変数を使用する必要があります。正確な精度が要求されないように、浮動小数点座標を別々に累積します。

+0

これは本当に小さな値(1/400)で切り上げられていたので、浮動小数点カウンタを使用してはいけませんでした。助けてくれてありがとう^^ –

関連する問題