Example #1
0
int setupVBOfromObj(char *objFileName){
    int objError;
    if((objError = obj.readFromFile(objFileName)))
        return objError;
    obj.scale();

    if(!obj.nNormals)
        obj.genFacesNormals();
    else if(!obj.normIndGood)
        obj.rebuildAttribTable('n');

    glGenVertexArrays(1, &handleOBJVAO);

    glBindVertexArray(handleOBJVAO);
    glGenBuffers(NUM_BUFFERS, OBJbuffers);

    glBindBuffer(GL_ARRAY_BUFFER, OBJbuffers[VERTICES]);
    glBufferData(GL_ARRAY_BUFFER, 3*obj.nAttribs*sizeof(GLfloat), obj.vertices, GL_STATIC_DRAW);
    glVertexPointer(3, GL_FLOAT, 0, BUFFER_OFFSET(0));
    glEnableClientState(GL_VERTEX_ARRAY);


    glBindBuffer(GL_ARRAY_BUFFER, OBJbuffers[NORMALS]);
    glBufferData(GL_ARRAY_BUFFER, 3*obj.nAttribs*sizeof(GLfloat), obj.normals, GL_STATIC_DRAW);
    glNormalPointer(GL_FLOAT, 0, BUFFER_OFFSET(0));
    glEnableClientState(GL_NORMAL_ARRAY);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, OBJbuffers[INDICES]);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, 3*obj.nFaces*sizeof(GLuint), obj.faces,   GL_STATIC_DRAW);

    return 0;
}
Example #2
0
//=============================================================================
// inicjalizacja stałych elementów maszyny stanu OpenGL
//=============================================================================
int init(char *objFileName)
{
//   definicja sześchar *objFileNamecianu:
// wierzchołki
GLfloat cubeVertices[3*8] = {
	-0.1f, -0.1f,  0.1f,
	 0.1f, -0.1f,  0.1f,
	-0.1f,  0.1f,  0.1f,
	 0.1f,  0.1f,  0.1f,
	-0.1f, -0.1f, -0.1f,
	 0.1f, -0.1f, -0.1f,
	-0.1f,  0.1f, -0.1f,
	 0.1f,  0.1f, -0.1f
};
// normalne
GLfloat cubeNormals[3*8] = {
	-1.0f, -1.0f,  1.0f,
	 1.0f, -1.0f,  1.0f,
	-1.0f,  1.0f,  1.0f,
	 1.0f,  1.0f,  1.0f,
	-1.0f, -1.0f, -1.0f,
	 1.0f, -1.0f, -1.0f,
	-1.0f,  1.0f, -1.0f,
	 1.0f,  1.0f, -1.0f
};
// indeksy
GLuint cubeIndices[3*6*2] = {
	0, 1, 2,
	2, 1, 3,
	1, 5, 3,
	3, 5, 7,
	5, 4, 7,
	7, 4, 6,
	4, 0, 6,
	6, 0, 2,
	1, 0, 5,
	5, 0, 4,
	3, 7, 2,
	2, 7, 6
};

	int objError;

	// wczytanie obiektu z pliku .obj i przygotowanie go
	if ( (objError = obj.readFromFile(objFileName)) )
		return objError;
	obj.writeProps();
	// przeskalowanie wczytanego obj, tak aby był wpisany w jednostkowy sześcian
	// o środku w początku układu współrzędnych
	obj.scale();

	// sprawdzenie czy zostały poprawnie zdefiniowane normalne
	if (!obj.nNormals)
		// wygenerowanie uśrednionych normalnych
		obj.genSmoothNormals();
		// wygenerowanie normalnych dla ścianek
		//obj.genFacesNormals();
	else
		if (!obj.normIndGood)
			// gdy indeksy normalnych nie zgadzają się z indeksami wierzhołków
			obj.rebuildAttribTable('n');

	cout << "===================================================" << endl;
	// wypisanie właściwości wczytanego obiektu
	obj.writeProps();
//	obj.writeTables();


	// pobranie danych ze sterownika
	cout << "===================================================" << endl;
	cout << "Producent: " << glGetString(GL_VENDOR) << endl;
	cout << "Karta graficzna: " << glGetString(GL_RENDERER) << endl;
	cout << "Wersja OpenGL: " << glGetString(GL_VERSION) << endl;
	cout << "Wersja GLSL: " << glGetString(GL_SHADING_LANGUAGE_VERSION) << endl;
	cout << "===================================================" << endl;

	// ustawienie koloru tłatranslation.cpp
	glClearColor(1.0f, 1.0f, 1.0f, 1.0f);

	// wczytanie shaderów i przygotowanie obsługi programu
	AttachVertexShader(simplyShader, "simply_light_vs.glsl");
	AttachFragmentShader(simplyShader, "simply_light_fs.glsl");
	// wykonanie powiązania pomiędzy zmienną a indeksem ogólnych atrybutów wierzchołka
	LinkProgram(simplyShader);

	// wczytanie shaderów i przygotowanie obsługi programu
	AttachVertexShader(ambientShader, "ambient_light_vs.glsl");
	AttachFragmentShader(ambientShader, "ambient_light_fs.glsl");
	// wykonanie powiązania pomiędzy zmienną a indeksem ogólnych atrybutów wierzchołka
	LinkProgram(ambientShader);

	// wygenerowanie i włączenie tablicy wierzchołków sześcianu
	glGenVertexArrays(1, &cubeVertexArray1);
	createVertexArray(cubeVertexArray1,
		cubeVertices, sizeof(cubeVertices),
		cubeNormals, sizeof(cubeNormals),
		cubeIndices, sizeof(cubeIndices));

	glGenVertexArrays(1, &cubeVertexArray2);
	createVertexArray(cubeVertexArray2,
		cubeVertices, sizeof(cubeVertices),
		cubeNormals, sizeof(cubeNormals),
		cubeIndices, sizeof(cubeIndices));

	glGenVertexArrays(1, &cubeVertexArray3);
	createVertexArray(cubeVertexArray3,
		cubeVertices, sizeof(cubeVertices),
		cubeNormals, sizeof(cubeNormals),
		cubeIndices, sizeof(cubeIndices));

	glGenVertexArrays(1, &cubeVertexArray4);
	createVertexArray(cubeVertexArray4,
		cubeVertices, sizeof(cubeVertices),
		cubeNormals, sizeof(cubeNormals),
		cubeIndices, sizeof(cubeIndices));

	// wygenerowanie i włączenie tablicy wierzchołków .obj
	glGenVertexArrays(1, &objVertexArray);
	createVertexArray(objVertexArray,
		(GLfloat*)obj.vertices, 3*obj.nAttribs*sizeof(GLfloat),
		(GLfloat*)obj.normals, 3*obj.nAttribs*sizeof(GLfloat),
		(GLuint*)obj.faces, 3*obj.nFaces*sizeof(GLuint));

	// włączenie wykorzystania bufora głębokości
	glEnable(GL_DEPTH_TEST);

	// // ustawienie sposobu rysowania odpowiednich stron ścian
	glPolygonMode(GL_FRONT, GL_FILL);
	glPolygonMode(GL_BACK, GL_LINE);

	// // właczenie pominięcia renderowania niewidocznych ścian
	glEnable(GL_CULL_FACE);

	return 0;
}