2013-06-26 3 views
1

Вот моя вершинный шейдер:WebGL: drawArrays: attribs не установлен правильно

attribute vec3 aVertexPosition; 
    attribute vec4 aVertexColor; 
    attribute float type; 

    uniform mat4 uMVMatrix; 
    uniform mat4 uPMatrix; 

    varying vec4 vColor; 

    void main(void) { 
     gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0); 
     vColor = aVertexColor; 
     if(type > 0.0) { 

     } else { 

     } 
    } 

То, что я хочу сделать, это довольно просто, просто захватить значение с плавающей точкой с именем type и использовать его для логики работает.

Проблема заключается в том, когда я пытаюсь использовать его в Javascript, ошибка приходит:

shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "type"); 
gl.enableVertexAttribArray(shaderProgram.textureCoordAttribute); 


WebGL: INVALID_OPERATION: drawArrays: attribs not setup correctly main.js:253 
WebGL: INVALID_OPERATION: drawArrays: attribs not setup correctly main.js:267 
WebGL: INVALID_OPERATION: drawElements: attribs not setup correctly 

Выход getAttribLocation имеет смысл, все они равны больше 0.

= ================ UPDATE ===================

Вот весь мой код проекта:

https://gist.github.com/royguo/5873503

Объяснение:

  • index.html шейдеры скрипт здесь.
  • main.js Запустите приложение WebGL и нарисуйте сцену.
  • shaders.js Загрузите шейдеры и привяжите атрибуты.
  • buffers.js Исходные вершинные и цветные буферы.
  • utils.js Общие используемые утилиты.
+0

Вы пытались использовать float вместо vec2? Кстати, использование ветвей, зависящих от атрибутов внутри вашего шейдера, является основным хитом производительности, я всегда стараюсь использовать математическую инструкцию вместо ветвей. – Marius

+0

@Marius, Спасибо! Я изменил vec2 на float, но проблема все еще существует. 'INVALID_OPERATION' ... – MrROY

+0

Ваш код выглядит правильно, ошибка должна быть где-то в другом месте. – Marius

ответ

1

Вот link к сути с файлами я обновленными, чтобы получить атрибут рабочего type.

Если вы ищете //ADDED CODE, вы должны быть в состоянии просмотреть все изменения, которые мне пришлось внести, чтобы заставить его работать.

В дополнение к предоставлению objectTypeAttribute вы должны создать буфер массива для каждого объекта вы рисуете:

triangleObjectTypeBuffer = gl.createBuffer(); 
    gl.bindBuffer(gl.ARRAY_BUFFER, triangleObjectTypeBuffer); 
    objectTypes = [ 
    1.0, 1.0, 0.0 
    ]; 
    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(objectTypes), gl.STATIC_DRAW); 
    triangleObjectTypeBuffer.itemSize = 1; 
    triangleObjectTypeBuffer.numItems = 3; 

И связать этот буфер массив для каждого объекта, прежде чем нарисовать объект:

gl.bindBuffer(gl.ARRAY_BUFFER, triangleObjectTypeBuffer); 
    gl.vertexAttribPointer(shaderProgram.objectTypeAttribute, triangleObjectTypeBuffer.itemSize, gl.FLOAT, false, 0, 0); 

Вероятно, вы уже пробовали это и случайно поступили неправильно.

+0

Спасибо, это имеет смысл для меня сейчас! Только для подтверждения: имеет ли номер элемента массива 'objectType' тот же самый номер элемента вершины? – MrROY

+0

Да, это правильно. – Anton

+0

Еще один вопрос ... Могу ли я получить положение каждого пикселя в шейдере фрагмента? Спасибо – MrROY