Показать сообщение отдельно
Старый 13.06.2012, 12:28   #1
ІГРОГРАЙКО
ПроЭктировщик
 
Аватар для ІГРОГРАЙКО
 
Регистрация: 20.06.2009
Адрес: Україна
Сообщений: 152
Написано 10 полезных сообщений
(для 24 пользователей)
Вопрос WebGL глюк с полигональной сетью

Привет.
Проблема: Не получается построить полигональную сетку размерностью 32*32*32 квада.

Вот мой код:
	function fillQuad(xn,yn,zn) {
	var vertices = new Array();									//Масив вершин
	var sc_x = xn / 2;
	var sc_y = yn / 2;
	var sc_z = zn / 2;
	var iz,iy,ix;
		for (iz = -sc_z; iz < sc_z; iz++)
		{
			for (iy = -sc_y; iy < sc_y; iy++)
			{
				for (ix = -sc_x; ix < sc_x; ix++)
				{
					vertices.push(ix, iy+1, iz);				//додавання кординати вершини до масиву
					vertices.push(ix+1, iy+1, iz);
					vertices.push(ix+1, iy, iz);
					vertices.push(ix, iy, iz);
				}
			}
		}
	return vertices;
	}

	function fillBuffer(length) {
	var indecises = new Array();	
	alert(length);
		for (var n = 0; n < length ; n = n + 4)
		{
			indecises.push(n, n+1, n+2);
			indecises.push(n, n+2, n+3);
			bar.value = n / length * 1000;
		}
	return indecises;
	}

    	function initBuffers() {
        	QuadVertexPositionBuffer = gl.createBuffer();
		gl.bindBuffer(gl.ARRAY_BUFFER, QuadVertexPositionBuffer);		//Тип заповнення буферу
		var tWidth = 16;			//розмірність по осі X
		var tHeight = 16;			//розмірність по осі Y
		var tDepth = 16;			//розмірність по осі Z
		var QuadMass = new Array();
		QuadMass = fillQuad(tWidth,tHeight,tDepth);	//Вершини фронтальних полігонів
		gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(QuadMass), gl.STATIC_DRAW);
		
		//Запис індексів вершин мешу
		QuadIndecises = gl.createBuffer();
		gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, QuadIndecises);
		var Indecises = new Array();
		Indecises = fillBuffer(tWidth * tHeight * tDepth * 6);
		gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(Indecises), gl.STATIC_DRAW);
		QuadIndecises.numItems = tWidth * tHeight * tDepth;
    	}

	function drawScene() {
        gl.viewport(0, 0, gl.viewportWidth, gl.viewportHeight);
        gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);

		//Перспектива
        mat4.perspective(45, gl.viewportWidth / gl.viewportHeight, 0.1, 1000.0, pMatrix);
        mat4.identity(mvMatrix);

		//Переміщення
		animate();
        mat4.translate(mvMatrix, [0.0, 0.0, -80.0]);
		mat4.rotate(mvMatrix, camR, [1, 1, 1]);
		
		//Надсилання обєктів на обробку в шейдерну програму
		//Масив вершин
        gl.bindBuffer(gl.ARRAY_BUFFER, QuadVertexPositionBuffer);
        gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute, 3, gl.FLOAT, false, 0, 0);
		//Індекси вершин
		gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, QuadIndecises);
		//Обробка трансформацій матриць
        setMatrixUniforms();
		
		//Вивід
        gl.drawElements(gl.TRIANGLES, QuadIndecises.numItems * 6, gl.UNSIGNED_SHORT, 0);
    }
Нажмите на изображение для увеличения
Название: canvas1.png
Просмотров: 911
Размер:	13.2 Кб
ID:	17033

Но если:

    	function initBuffers() {
        	QuadVertexPositionBuffer = gl.createBuffer();
		gl.bindBuffer(gl.ARRAY_BUFFER, QuadVertexPositionBuffer);		//Тип заповнення буферу
		var tWidth = 32;			//розмірність по осі X
		var tHeight = 32;			//розмірність по осі Y
		var tDepth = 32;			//розмірність по осі Z
		var QuadMass = new Array();
		QuadMass = fillQuad(tWidth,tHeight,tDepth);	//Вершини фронтальних полігонів
		gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(QuadMass), gl.STATIC_DRAW);
		
		//Запис індексів вершин мешу
		QuadIndecises = gl.createBuffer();
		gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, QuadIndecises);
		var Indecises = new Array();
		Indecises = fillBuffer(tWidth * tHeight * tDepth * 6);
		gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(Indecises), gl.STATIC_DRAW);
		QuadIndecises.numItems = tWidth * tHeight * tDepth;
    	}
то:
Нажмите на изображение для увеличения
Название: canvas.png
Просмотров: 997
Размер:	15.5 Кб
ID:	17032

Я не знаю в чем ошибка. Помогите пожалуйста.
__________________
Blitz3D, XNA, WebGL, OpenGL, Unity3D
PC: ASUS A55VM Core i3 (2.4Ghz), 6 Gb RAM, Nvidia GF 630M GT 2Gb
(Offline)
 
Ответить с цитированием