Войти
Мобильные платформыФорумОбщее

Android: glVertexAttribPointer

#0
1:22, 26 ноя. 2013

Добрый день. Собственно такая проблема. Имеется один обобьет, скайбокс. Задан массивом точек. При отображение одного скайбокса, рисует нормально. Но когда пытаюсь добавить другие объекты, на их собственном шейдере, возникает проблема. Полигоны скайбокса, начинают плыть, или вовсе не отображаются. Проблема происходит при связывание других объектовый, с их атрибутами в шейдере.

 p    public void linckAttribut(FloatBuffer AttributBuffer, String attribute, int Offset, int dataSize) {
        AttributBuffer.position(Offset);
        int attributeHandle=GLES20.glGetAttribLocation(programHandle,attribute);
        if(attributeHandle==-1)
            {
                Log.d(TAG, "Eroro lincing atribute: "+ attribute);
                throw new RuntimeException("Error creating program.");
            }
        GLES20.glVertexAttribPointer(attributeHandle, dataSize, GLES20.GL_FLOAT, false, 0, AttributBuffer); // вот на этой строчке.
        GLES20.glEnableVertexAttribArray(attributeHandle); 

    }

Весь день не могу понять причину.


#1
12:30, 26 ноя. 2013

Последний параметр для glVertexAttribPointer это offset

#2
12:33, 26 ноя. 2013

Т.е. как-то так:
glVertexAttribPointer( AttribIndex, VertexSize, AttribFormat, bNormalized, VertexStride, (void*)AttribOffset );

Т.е. смещение компонента вертекса: pos(0), normal(12), ...

#3
13:35, 26 ноя. 2013


Kroll
public static void glVertexAttribPointer (int indx, int size, int type, boolean normalized, int stride, Buffer ptr)

#4
14:05, 26 ноя. 2013

Gerbarium
Смотря как передавать вершины. Это вариант для одного буфера, где представлены все нужные компоненты.
http://www.khronos.org/opengles/sdk/docs/man/

#5
14:10, 26 ноя. 2013

Kroll
Какой из них? )

#6
14:33, 26 ноя. 2013

В http://www.khronos.org/opengles/sdk/docs/man/ описание glVertexAttribPointer.

If a non-zero named buffer object is bound to the GL_ARRAY_BUFFER target
        (see glBindBuffer) while a generic vertex attribute array is
        specified, pointer is treated as a byte offset into the buffer object's data store.

#7
15:14, 26 ноя. 2013

Kroll
  GLES20.glBindBuffer(programHandle,attributeHandle);
        GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, AttributBuffer.capacity(), AttributBuffer, GLES20.GL_STATIC_DRAW);
        GLES20.glVertexAttribPointer(attributeHandle, dataSize, GLES20.GL_FLOAT, false,  0,0);
        GLES20.glEnableVertexAttribArray(attributeHandle);


подскажите где я ошибся?

#8
15:38, 26 ноя. 2013

Создаём буфер.

glGenBuffers( 1, &VB );
glBindBuffer( GL_ARRAY_BUFFER, VB );
glBufferData( GL_ARRAY_BUFFER, VertSizeBytes, pData, GL_STATIC_DRAW );
// Если есть индексный
glGenBuffers( 1, &IB );
glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, IB );
glBufferData( GL_ELEMENT_ARRAY_BUFFER, IndSizeBytes, pData, GL_STATIC_DRAW );
//  атрибуты
for(AttribIndex=0; AttribIndex<N; AttribIndex++ )
{   glBindAttribLocation( GlProg, AttribIndex, AttribNames[AttribIndex] );
}

Биндим во время рендера.

glBindBuffer( GL_ARRAY_BUFFER, VB );
//  если есть индексный
glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, IB );
//  атрибуты
for( AttribIndex=0; AttribIndex<N; AttribIndex++ )
{  glEnableVertexAttribArray(  AttribIndex );
    glVertexAttribPointer( AttribIndex, AttribSize[AttribIndex], AttribFormat[AttribIndex], false, VertexStride, (void*)AttribOffset[AttribIndex] );
}

Мобильные платформыФорумОбщее

Тема в архиве.