3

ポイントリストにない原点に余分なポイントを追加しているように見えるという点で、スケッチした線を画面に描画するときにopenGLに問題があります。

画像

(0,0) は、描画される配列にあるポイントには絶対にありません。理由がわかりません。おそらく私の配列サイズが大きすぎるか何かだと思いますが、それを見ることができません

配列と描画呼び出しを設定するための私のコードは次のとおりです

void PointArray::repopulateObjectBuffer()
{
  //Rebind Appropriate VAO
  glBindVertexArray( vertex_array_object_id );

  //Recalculate Array Size
  vertexArraySize = points.size()*sizeof(glm::vec2);

  //Rebind Appropriate VBO
  glBindBuffer( GL_ARRAY_BUFFER, buffer_object_id );
  glBufferData( GL_ARRAY_BUFFER, vertexArraySize, NULL, GL_STATIC_DRAW );
  glBufferSubData( GL_ARRAY_BUFFER, 0, vertexArraySize, (const GLvoid*)(&points[0]) );

  //Set up Vertex Arrays  
  glEnableVertexAttribArray( 0 ); //SimpleShader attrib at position 0 = "vPosition"
  glVertexAttribPointer( (GLuint)0, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0) );

  //Unbind
  glBindBuffer(GL_ARRAY_BUFFER, 0);
  glBindVertexArray(0);
}

void PointArray::draw() {
glBindVertexArray(vertex_array_object_id);

glLineWidth(4);
glDrawArrays( GL_LINE_STRIP, 0, vertexArraySize );

glBindVertexArray(0);
}

ここで、マウスのコールバックにポイントを追加しています

void mouseMovement(int x, int y) 
{
  mouseDX = x - lastX ;
  mouseDY = y - lastY ;
  lastX = x;
  lastY = y;

  if(mouse_drag)
  {
    cam->RotateByMouse(glm::vec2(mouseDX*mouseSens, mouseDY * mouseSens));
  }
  if(sketching)
  {
    sketchLine.addPoint(glm::vec2((float)x,(float)y));
    sketchLine.repopulateObjectBuffer();
    updatePickray(x,y);
  }
}

最後に、私のシンプルなオルソ頂点シェーダー

in vec2 vPosition;

void main(){

const float right = 800.0;
const float bottom = 600.0;
const float left = 0.0;
const float top = 0.0;
const float far = 1.0;
const float near = -1.0;

 mat4 orthoMat = mat4(
    vec4(2.0 / (right - left),              0,                                0,                            0),
    vec4(0,                                 2.0 / (top - bottom),             0,                            0),
    vec4(0,                                 0,                               -2.0 / (far - near),           0),
    vec4(-(right + left) / (right - left), -(top + bottom) / (top - bottom), -(far + near) / (far - near),  1)
);

gl_Position = orthoMat * vec4(vPosition, 0.0, 1.0);
}
4

1 に答える 1

2

glDrawArrays のパラメーターとして使用しているようですがvertexArraySize、これは正しくありません。glDrawArrays の数は、頂点配列のバイト数ではなく、頂点の数でなければなりません。

あなたの場合、それはglDrawArrays( GL_LINE_STRIP, 0, points.size());.

于 2012-11-01T19:26:22.417 に答える