Тест Android с помощью OpenGL ES Shaders - PullRequest
0 голосов
/ 09 марта 2012

Здравствуйте, я сейчас учусь OpenGL ES и использованию шейдеров. Я написал тестовый класс, который должен рисовать только значок приложения на экране. Пока не повезло. Кто-нибудь может видеть, что я делаю неправильно, или, может быть, указывает мне правильное направление?

public class GLTester
{


void test(final Context context)
{
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inScaled = false;
    bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.icon, options);

    setupGLES();
    createProgram();
    setupTexture();
    draw();
}


void draw()
{
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
    glUseProgram(glProgramHandle);

}
}

Ответы [ 2 ]

2 голосов
/ 13 марта 2012

Пара вещей.

Полагаю, ваш буфер squareVertices должен содержать 4 vec3s. Но ваш шейдер настроен на vec4s. Может быть, это нормально, но мне это кажется странным.

Вы также не настраиваете какую-либо перспективную матрицу с помощью glFrustum или glOrtho, а также не настраиваете какую-либо матрицу просмотра с чем-то вроде Matrix.setLookAtM. Вы также всегда должны помнить о конвейере вершин. Посмотрите на слайд 2 из этой лекции https://wiki.engr.illinois.edu/download/attachments/195761441/3-D+Transformational+Geometry.pptx?version=2&modificationDate=1328223370000

Я думаю, что происходит, когда ваши квадратные вершины проходят через этот конвейер и выходят на другую сторону в виде пиксельных координат. Таким образом, ваше изображение, вероятно, очень крошечная характеристика в углу экрана, поскольку вы используете вершины от -1,0 до 1,0.

Как бесстыдное знакомство, я разместил некоторый код на SourceForge, который позволяет работать с шейдерами и загружать их из файла в папке ресурсов, а не делать это внутри файлов .java в виде строк. https://sourceforge.net/projects/androidopengles/ Theres пример проекта в разделе файлов, который использует этот помощник шейдера.

Я надеюсь, что какая-то часть этого бессвязного была полезна. :)

0 голосов
/ 09 марта 2012

Это выглядит довольно неплохо, но я вижу, что вы, во-первых, вызываете glUniform внутри setupTexture, в то время как шейдер не имеет текущих ограничений.Вы должны вызывать glUniform только после вызова glUseProgram.

Я не знаю, в этом ли проблема, потому что я бы предположил, что в любом случае это будет значение по умолчанию 0, но я точно не знаю.

Кроме этого, вам следует познакомиться с вызовом glGetError, чтобы проверить, есть ли какие-либо ожидающие ошибки условия.

Кроме того, при создании шейдеров полезно проверять их статус успеха с помощью glGetShader (GL_COMPILE_STATUS)также glGetShaderInfoLog, если компиляция не удалась, и аналогична для программ с glGetProgram / glGetProgramInfoLog.

...