OpenGL ES 2.0 текстурирование - PullRequest
4 голосов
/ 03 декабря 2010

Я пытаюсь визуализировать простой текстурированный квад в OpenGL ES 2.0 на iPhone. Геометрия в порядке, и я получаю ожидаемый квад, если я использую однотонный цвет в своем шейдере:

    gl_FragColor = vec4 (1.0, 0.0, 0.0, 1.0);

И я получаю ожидаемые градиенты, если визуализирую координаты текстуры напрямую:

    gl_FragColor = vec4 (texCoord.x, texCoord.y, 0.0, 1.0);

Данные изображения загружаются из UIImage, масштабируются до размера 1024x1024 и загружаются в текстуру, например, так:

    glGenTextures (1, &_texture);
    glBindTexture (GL_TEXTURE_2D, _texture);

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, 
        GL_UNSIGNED_BYTE, data);

width, height и содержимое data все правильно, как проверено в отладчике.

Когда я меняю фрагментный шейдер на использование текстуры:

    gl_FragColor = texture2D (tex, texCoord);

... и связать текстуру и визуализировать так:

    glActiveTexture (GL_TEXTURE0);
    glBindTexture (GL_TEXTURE_2D, _texture);

    // this is unnecessary, as it defaults to 0, but for completeness...
    GLuint texLoc = glGetUniformLocation(_program, "tex");          
    glUniform1i(texLoc, 0);

    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

... я ничего не получаю. Черный квад glGetError() не возвращает ошибку, а glIsTexture(_texture) возвращает true.

Что я здесь не так делаю? Я много раз повторял каждый пример, который мог найти в Интернете, но все делают это именно так, как я, и отладчик показывает мои параметры для различных функций GL, как я и ожидал.

Ответы [ 5 ]

1 голос
/ 31 января 2012

убедитесь, что для параметров обтекания текстуры установлено значение GL_CLAMP_TO_EDGE в направлениях S и T. Без этого текстура будет неполной и будет выглядеть черной.

1 голос
/ 10 января 2011

У меня возникла та же проблема (черный квад), и я не мог найти ответ, пока ответ jfcalvo от на этот вопрос не привел меня к причине.В основном убедитесь, что вы не загружаете текстуру в другом потоке.

1 голос
/ 04 декабря 2010

После glTexImage2D установите фильтры MIN / MAG с помощью glTexParameter, значения по умолчанию используют mipmaps, поэтому текстура не является полной с этим кодом.

0 голосов
/ 27 ноября 2017

может быть, вы забыли

glEnable (GL_TEXTURE_2D);

В таком случае texture2D в шейдере вернет черный цвет, так как OP, похоже, страдает.

0 голосов
/ 03 мая 2011

убедитесь, что вы звоните (glTexImage2D) с правильными форматами (константами)

убедитесь, что вы освобождаете ресурсы изображения после glTexImage2D

вот как я это делаюна андроид:

    int[] textures = new int[1];
            GLES20.glGenTextures(1, textures, 0);

            mTextureID = textures[0];
            GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureID);

            GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER,
                    GLES20.GL_NEAREST);
            GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,
                    GLES20.GL_TEXTURE_MAG_FILTER,
                    GLES20.GL_LINEAR);

            GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S,
                    GLES20.GL_REPEAT);
            GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T,
                    GLES20.GL_REPEAT);

            InputStream is = mContext.getResources()
                .openRawResource(R.drawable.ywemmo2);
            Bitmap bitmap;
            try {
                bitmap = BitmapFactory.decodeStream(is);
            } finally {
                try {
                    is.close();
                } catch(IOException e) {
                    // Ignore.
                }
 GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);
        bitmap.recycle();
...