Ejemplo n.º 1
0
ImpostorSpheres::ImpostorSpheres():
num_balls(1000000){
    mode = GL_TRIANGLE_STRIP;

    glGenVertexArrays(1, &vertexArrayObjectHandle);
    glBindVertexArray(vertexArrayObjectHandle);

    GLuint positionBuffer;
    glGenBuffers(1, &positionBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, positionBuffer);
    GLfloat positions[] = {
        -1.0f, -1.0f,
        -1.0f, 1.0f,
        1.0f, -1.0f,
        1.0f, 1.0f
    };

    std::vector<GLfloat> instance_colors;
    std::vector<GLfloat> instance_positions;

        for (int i = 0; i < num_balls*4; i+=4) {
            instance_colors.push_back(r_pos(1.0));
            instance_colors.push_back(r_pos(1.0));
            instance_colors.push_back(r_pos(1.0));
            instance_colors.push_back(1);

            instance_positions.push_back(r_equ(30));
            instance_positions.push_back(r_equ(30));
            instance_positions.push_back(r_equ(30));
            instance_positions.push_back(1 + r_equ(0.5));
        }

    glBufferData(GL_ARRAY_BUFFER,
                 sizeof(positions) +
                 sizeof(GLfloat) * instance_colors.size() +
                 sizeof(GLfloat) * instance_positions.size(), NULL, GL_STATIC_DRAW);

    GLuint offset = 0;
    glBufferSubData(GL_ARRAY_BUFFER, offset, sizeof(positions), positions);
    offset += sizeof(positions);
    glBufferSubData(GL_ARRAY_BUFFER, offset, sizeof(GLfloat) * instance_colors.size(), &instance_colors[0]);
    offset += sizeof(GLfloat) * instance_colors.size();
    glBufferSubData(GL_ARRAY_BUFFER, offset, sizeof(GLfloat) * instance_positions.size(), &instance_positions[0]);
    offset += sizeof(GLfloat) * instance_positions.size();

    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, NULL);
    glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, (GLvoid*)sizeof(positions));
    glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, 0, (GLvoid*)(sizeof(positions) + sizeof(GLfloat) * instance_colors.size()));

    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);
    glEnableVertexAttribArray(2);

    glVertexAttribDivisor(0,0);
    glVertexAttribDivisor(1,1);
    glVertexAttribDivisor(2,1);
}
Ejemplo n.º 2
0
	void set_random_goal() {
		std::uniform_real_distribution<float> r_pos(-WORLD_SIZE, +WORLD_SIZE);
		goal = { r_pos(s_rnd), r_pos(s_rnd) };
	}
void InstancedMeshExample::dumpSceneToVAO(const aiScene *scene) {
    GLuint vbo[4];
    glGenBuffers(4, vbo);
	glGenVertexArrays(1, &vertexArrayObjectHandle);
	glBindVertexArray(vertexArrayObjectHandle);

	count = 0;
	GLuint vertexCount = 0;
	for(int i = 0; i < scene->mNumMeshes; i++) {
		aiMesh* mesh = scene->mMeshes[i];
		count += mesh->mNumFaces * 3;
		vertexCount += mesh->mNumVertices;
	}

	GLfloat* positions = new GLfloat[vertexCount * 3];
	GLfloat* normals = new GLfloat[vertexCount * 3];
	GLfloat* uvs = new GLfloat[vertexCount * 2];
	GLuint* indices = new GLuint[count];

	int current_p = 0;
	int current_n = 0;
	int current_uv = 0;
	int current_i = 0;


	for(int i = 0; i < scene->mNumMeshes; i++) {
		aiMesh* mesh = scene->mMeshes[i];


		for(int i = 0; i < mesh->mNumVertices; i++) {
			positions[current_p++] = mesh->mVertices[i].x;
			positions[current_p++] = mesh->mVertices[i].y;
			positions[current_p++] = mesh->mVertices[i].z;
		}

		for(int i = 0; i < mesh->mNumVertices; i++) {
			uvs[current_uv++] = mesh->mTextureCoords[0][i].x;
			uvs[current_uv++] = mesh->mTextureCoords[0][i].y;
		}

		for(int i = 0; i < mesh->mNumVertices; i++) {
			normals[current_n++] = mesh->mNormals[i].x;
			normals[current_n++] = mesh->mNormals[i].y;
			normals[current_n++] = mesh->mNormals[i].z;
		}

		for(int i = 0; i < mesh->mNumFaces; i++) {
			indices[current_i++] = mesh->mFaces[i].mIndices[0];
			indices[current_i++] = mesh->mFaces[i].mIndices[1];
			indices[current_i++] = mesh->mFaces[i].mIndices[2];
		}
	}
			
	glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);
	glBufferData(GL_ARRAY_BUFFER, 3 * vertexCount * sizeof(GLfloat), positions, GL_STATIC_DRAW);
	glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
	glEnableVertexAttribArray (0);

	glBindBuffer(GL_ARRAY_BUFFER, vbo[1]);
	glBufferData(GL_ARRAY_BUFFER, 2 * vertexCount * sizeof(GLfloat), uvs, GL_STATIC_DRAW);
	glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, NULL);
	glEnableVertexAttribArray (1);

	glBindBuffer(GL_ARRAY_BUFFER, vbo[2]);
	glBufferData(GL_ARRAY_BUFFER, 3 * vertexCount * sizeof(GLfloat), normals, GL_STATIC_DRAW);
	glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, NULL);
	glEnableVertexAttribArray (2);

	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo[3]);
	glBufferData(GL_ELEMENT_ARRAY_BUFFER, 3 * count * sizeof(GLuint), indices, GL_STATIC_DRAW);
	glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, 0, NULL);
	glEnableVertexAttribArray (3);

    std::vector<GLfloat> instance_colors;
    std::vector<GLfloat> instance_positions;

        for (int i = 0; i < num_balls*4; i+=4) {
            instance_colors.push_back(r_pos(1.0));
            instance_colors.push_back(r_pos(1.0));
            instance_colors.push_back(r_pos(1.0));
            instance_colors.push_back(1);

            instance_positions.push_back(r(30));
            instance_positions.push_back(r(30));
            instance_positions.push_back(r(30));
            instance_positions.push_back(abs(1 + r(0.4)) / 2.0f);
        }

    glBindBuffer(GL_ARRAY_BUFFER, vbo[4]);
    glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * instance_colors.size(),
                 &instance_colors[0], GL_STATIC_DRAW);
    glVertexAttribPointer(4, 4, GL_FLOAT, GL_FALSE, 0, NULL);
    glEnableVertexAttribArray (4);

    glBindBuffer(GL_ARRAY_BUFFER, vbo[5]);
    glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * instance_positions.size(),
                 &instance_positions[0], GL_STATIC_DRAW);
    glVertexAttribPointer(5, 4, GL_FLOAT, GL_FALSE, 0, NULL);
    glEnableVertexAttribArray (5);

    glVertexAttribDivisor(4,1);
    glVertexAttribDivisor(5,1);

    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindVertexArray(0);

	delete positions;
	delete normals;
	delete uvs;
    delete indices;
}