4

このチュートリアルをGolangで使用しようとしました:http ://www.opengl-tutorial.org/beginners-tutorials/tutorial-2-the-first-triangle/ go-versionはウィンドウを開き、背景を青にしますが、三角形は表示されません。cバージョンはそれを示しています。これはGoのコードです:

err := glfw.Init()
if err != nil {
    log.Fatal("Failed to init GLFW: " + err.Error())
}

err = glfw.OpenWindow(1024, 768, 0,0,0,0, 32,0, glfw.Windowed)
if err != nil {
    log.Fatal("Failed to open GLFW window: " + err.Error())
}

if gl.Init() != 0 {
    log.Fatal("Failed to init GL")
}

gl.ClearColor(0.0, 0.0, 0.3, 0.0)

// create vertexbuffer
gVertexBufferData := []float32{-1.0,-1.0,0.0, 1.0,-1.0,0.0, 0.0,1.0,0.0}
vertexBuffer := gl.GenBuffer()
vertexBuffer.Bind(gl.ARRAY_BUFFER)
gl.BufferData(gl.ARRAY_BUFFER, len(gVertexBufferData), gVertexBufferData, gl.STATIC_DRAW)

for {
    // clear screen
    gl.Clear(gl.COLOR_BUFFER_BIT)

    // first attribute buffer: vertices
    var vertexAttrib gl.AttribLocation = 0
    vertexAttrib.EnableArray()
    vertexBuffer.Bind(gl.ARRAY_BUFFER)
    var f float32 = 0.0
    vertexAttrib.AttribPointer(
        3,     // size
        false, // normalized?
        0,     // stride
        &f) // array buffer offset

    // draw the triangle
    gl.DrawArrays(gl.TRIANGLES, 0, 3)

    vertexAttrib.DisableArray()

    glfw.SwapBuffers()
}

そしてこれは機能するcのコードです:

if(!glfwInit())
    return -1;

if(!glfwOpenWindow( 1024, 768, 0,0,0,0, 32,0, GLFW_WINDOW ))
    return -1;

if(glewInit() != GLEW_OK)
    return -1;

glClearColor(0.0f, 0.0f, 0.3f, 0.0f);

GLuint VertexArrayID;
glGenVertexArrays(1, &VertexArrayID);
glBindVertexArray(VertexArrayID);

static const GLfloat g_vertex_buffer_data[] = { 
    -1.0f, -1.0f, 0.0f,
    1.0f, -1.0f, 0.0f,
    0.0f,  1.0f, 0.0f,
};
GLuint vertexbuffer;
glGenBuffers(1, &vertexbuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);

while(1) {
    glClear( GL_COLOR_BUFFER_BIT );

    // 1rst attribute buffer : vertices
    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
    glVertexAttribPointer(
        0,
        3, // size
        GL_FLOAT, // type
        GL_FALSE, // normalized?
        0, // stride
        (void*)0 // array buffer offset
    );

    // Draw the triangle !
    glDrawArrays(GL_TRIANGLES, 0, 3); // From index 0 to 3 -> 1 triangle

    glDisableVertexAttribArray(0);

    // Swap buffers
    glfwSwapBuffers();
}

(void *)0の代わりに何を指定すればよいかわからないため、vertexAttrib.AttribPointer()に間違った引数を指定している可能性があります。nilを試しましたが、アプリケーションがクラッシュしました。&gVertexBufferData[0]も機能しません。

glew-wrapperとしてgithub.com/banthar/glを使用しています。1.0.2とubuntu12.04amd64に移動します。

更新の編集:

glGetErrorはエラーを出しません

4

4 に答える 4

5

私は同じ問題を抱えていましたが、あなたの投稿を見てなんとか修正できました。まず第一に、どうもありがとうございました。

次の呼び出しで banthar バインディングの作業ブランチを使用して、三角形を表示することができましたAttribPointer

vertexAttrib.AttribPointer(
        3,     // size
        gl.FLOAT, //type
        false, // normalized?
        0,     // stride
        nil) // array buffer offset

サイズをバイト単位で BufferData に渡します。

[...]
data := []float32{0, 1, 0, -1, -1, 0, 1, -1, 0}
[...]
gl.BufferData(gl.ARRAY_BUFFER, len(data)*4, data, gl.STATIC_DRAW)
[...]

適切な長さを渡すには、おそらくもっと良い方法があります。

于 2012-08-29T14:44:17.433 に答える
1

私は同じ問題を抱えていましたが、何らかの理由で glfw.OpenWindowHint を呼び出すと、それが台無しになってしまいました。正しいコンテキストが要求され、opengl バージョンが一致し、エラーはまったく発生しませんが、機能しません。ヒントを省略すると、4.3 コンテキストが得られ、すべてが機能しているように見えます。

ヒントで4.3をリクエストしても動きません。他の何かを要求すると、opengl 文字列は一致しますが、やはり機能しません。

お役に立てれば

于 2012-09-20T00:30:08.760 に答える
0

Go への OpenGL バインディングが正確にどのように見えるかはわかりませんが、少なくともこれだけは言えます。

への最後のパラメータglVertexAttribPointerは、バッファオブジェクトの開始からのバイトオフセットでなければならないので、(あなたの場合) 0.

注: そのパラメーターの C 型はint、バイト オフセットであるため、通常は になります。代わりに、これvoid*は従来の理由によるものです。VBO の前は別の意味を持っていました。

&fリテラル 0 を渡すか、これが機能しない場合は値が 0 のポインターを渡す代わりに、Go でそれを行う方法は? 私はGoを理解していないので、これはあなたが理解するためのものです. OpenGL が何を期待しているかを説明しましたが、これが大いに役立つことを願っています。


また、デバッグについては、glGetError()頻繁に確認してください。

于 2012-07-01T17:41:07.820 に答える