2016-12-23 12 views
2
#define GLEW_STATIC 
#include <GL\glew.h> 
#include <GLFW\glfw3.h> 
#include <GL\glew.h> 
#include <glm.hpp> 
#include <iostream> 
#include <fstream> 
#include <string> 

#define WIDTH 800 
#define HEIGHT 600 
#define TITLE "Dynamic" 

GLFWwindow* window; 
int vaoID; 

float vertices[] = {-0.5f, 0.5f, 0, -0.5f, -0.5f, 0, 0.5f, 0.5f, 0, 0.5f, 0.5f, 0, -0.5f, -0.5f, 0, 0.5f, -0.5f, 0}; 

void loadToVAO(float vertices[]); 

void update() { 
    loadToVAO(vertices); 
    while (!glfwWindowShouldClose(window)) { 
     glfwPollEvents(); 
     glClear(GL_COLOR_BUFFER_BIT); 
     glClearColor(1, 0, 0, 1); 
     glDrawArrays(GL_TRIANGLES, 0, 6); 
     glfwSwapBuffers(window); 
    } 
} 

int main() { 
    if (!glfwInit()) 
     std::cout << "Couldn't initialize GLFW!" << std::endl; 

    window = glfwCreateWindow(WIDTH, HEIGHT, TITLE, NULL, NULL); 
    glfwMakeContextCurrent(window); 
    glfwSwapInterval(1); 

    if (GLEW_OK != glewInit()) 
     std::cout << "GLEW fucked up!" << std::endl; 

    std::cout << "Your GL version: " << glGetString(GL_VERSION) << std::endl; 
    glEnable(GL_CULL_FACE); 
    glCullFace(GL_BACK); 
    update(); 
} 



void loadShaders() { 

} 

void loadToVAO(float vertices[]) { 
    GLuint vboID; 
    GLuint vaoID; 
    glGenBuffers(1, &vboID); 
    glBindBuffer(GL_ARRAY_BUFFER, vboID); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices) * 8, vertices, GL_STATIC_DRAW); 
    glGenVertexArrays(1, &vaoID); 
    glBindVertexArray(vaoID); 
    std::cout << vaoID << std::endl; 
    glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0); 
    glEnableVertexAttribArray(0); 
} 

これは、頂点の位置を持つVBOを含むVAOを作成してレンダリングするためのコードです。しかし、残念ながらそれは動作しません。クワッドの代わりに三角形を描きます。しかし、whileループの前にupdateTo関数のコードを置くと動作します。C++/OpenGL VAOの問題

答えて

3

sizeof演算子は、常に基になる型のサイズを返します。 loadToVAOの内容を更新機能にコピーする場合、sizeof(vertices)は基本的にsizeof(float[18])で、これは配列の合計サイズです。

loadToVAOの内部では、sizeof(vertices)は、関数パラメータverticesをグローバル変数ではなく入力として受け取ります。

sizeof(vertices) == sizeof(float[]) == sizeof(float*) 

もうポインタ(4または8)の大きさとされていないデータのサイズである。ので、C++における不定サイズの配列パラメータは、我々がここにある同じタイプの点として扱われます。

これを解決するには、配列のサイズを関数に渡すこともできます。これは、Cの方法です。より現代的な方法は、最初にデータを格納するのにstd::arrayまたはstd::vectorを使用することです。

編集:2番目の表情では、最初にsizeof(vertices) * 8を使用したことがわかりました。あなたが8つの要素を持っていないし、フロートが8バイトのサイズを持っていないので、私は8がどこから来るのかは分かりません。

+0

ありがとう、それは今働いています。 8はバイトサイズ – Max

+0

と関係があります。これで問題が解決したら、答えを受け入れることを忘れないでください:) – BDL