2017-10-01 25 views
0

次のコードを書くためのチュートリアルを読んでいます。 唯一の違いは、GLEWではなくSDLを使用する元のチュートリアルです。シェーダなしのOpenGL

このコードで何が間違っているのか分かりません。それはコンパイルされますが、三角形は表示されません。 (チュートリアルでは、あまりにもシェーダを使用していなかった)

#include <iostream> 
#include <GL/glew.h> 
#include <GL/gl.h> 
#include <GLFW/glfw3.h> 

GLFWwindow* window; 

int main(int argc, const char * argv[]) 
{ 
    if (!glfwInit()) 
    { 
     return -1; 
    } 
    glfwWindowHint(GLFW_SAMPLES, 4); 
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); 
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); 

    window = glfwCreateWindow(640, 480, "Test", NULL, NULL); 
    if (window==NULL) 
    { 
     return -1; 
    } 
    glfwMakeContextCurrent(window); 

    glewExperimental = true; 
    if (glewInit() != GLEW_OK) 
    { 
     return -1; 
    } 

    glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE); 
    glClearColor(0.0f, 1.0f, 1.0f, 1.0f); 

    do 
    { 
     glfwPollEvents(); 

     float vertices[] = {-0.5, -0.5, 0.0, 0.5, 0.5, -0.5}; 
     glClear(GL_COLOR_BUFFER_BIT); 
     glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, vertices); 
     glEnableVertexAttribArray(0); 
     glDrawArrays(GL_TRIANGLES, 0, 3); 
     glDisableVertexAttribArray(0); 

     glfwSwapBuffers(window); 
    } 
    while(glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS && glfwWindowShouldClose(window) == 0); 

    glfwTerminate(); 

    return 0; 
} 
+0

を見る[完全GL + GLSL + VAO/VBO C++の例](https://でのstackoverflow .com/a/31913542/2521214)シンプルなシェーダの例です... – Spektre

答えて

6

あなたは固定機能パイプラインを使用している場合は、汎用の頂点glVertexAttribPointerのような属性を使用することはできません。

しかし、NVIDIAの実装は、一般的な属性と非一般的な属性の間の違法なエイリアスです。これはおそらく、チュートリアルの最初の作家が自分のマシンでそれを取り除いた理由です。あなたは、クロスプラットフォームな方法でこれを書きたい場合は

、あなたがglVertexPointerglEnableClientState使用する必要があります:

glVertexPointer(2, GL_FLOAT, 0, vertices); 
glEnableClientState(GL_VERTEX_ARRAY); 
+0

ありがとうございます。 OpenGLではいくつかの「プレビルド済み」シェーダがありますか? – Bob5421

+0

@ Bob5421:いいえ、それは固定機能のパイプラインです。なぜシェーダを使わない*に興味がありますか? –

+0

私は非常に基本的なプログラムを最初に書いています。そして、私は現代のOpenGLもやりたいです – Bob5421

関連する問題