2013-06-25 1 views
3

Этот вершинный шейдерный код работает на каждом устройстве, за исключением Galaxy Note 2. gl_Position = uMVPMatrix * vPosition; где, если я отменяю матричное умножение на: gl_Position = vPosition * uMVPMatrix; Я действительно могу заставить вещи появляться.Странная ошибка OpenGL ES 2.0 на Galaxy Note 2

К сожалению, обратное потребовало бы, чтобы я полностью переписал свою библиотеку преобразований.

У кого-нибудь есть понимание того, что может быть причиной этого, является ли это ошибкой драйвера opengl с устройством?

Shader код

private final String vertexShaderCode = 
    // This matrix member variable provides a hook to manipulate 
    // the coordinates of the objects that use this vertex shader 
    "uniform mat4 uMVPMatrix;" + 

    "attribute vec4 vPosition;" + 
    "attribute vec2 a_TexCoordinate;" + 
    "varying vec2 v_TexCoordinate;" + 
    "void main() {" + 
    // the matrix must be included as a modifier of gl_Position 
    "v_TexCoordinate = a_TexCoordinate;" + 
    "gl_Position = uMVPMatrix * vPosition;" + 
    "}"; 

private final String fragmentShaderCode = 
    "precision mediump float;" + 
    "uniform sampler2D u_Texture;" + 
    "varying vec2 v_TexCoordinate;" + 
    "void main() {" + 
    " gl_FragColor = texture2D(u_Texture, v_TexCoordinate);" + 
    //" gl_FragColor = vec4(v_TexCoordinate, 0, 1);" + 
    "}"; 
+0

Имеют ли то, что «vPosition» и «uMVPMatrix» имеют одинаковую точность? – keaukraine

+0

keaukraine, спасибо за ответ. Я действительно не уверен, если я не использую какой-либо модификатор точности, требуется ли это по умолчанию. Я попытался добавить «точность mediump float»; + к вершинеShaderCode, но это не повлияло. – Paul

+0

Это может произойти на устройствах Android, которые разные производители реализуют какую-то часть системы по-разному. Я уже заметил, что воспроизведение музыки (звука) немного отличается при реализации на HTC или Samsung. Это было то же самое с размером текстуры, имеющим мощность 2, HTC мог справиться с любым размером текстуры, в то время как Samsung требовал от них силы 2. Я бы сказал, что вы просто делаете оператор if, если есть телефон Samsung и используете разные шейдеры для этого. – Jani

ответ

0

Это не о том только платформы Galaxy Note 2.

Это математический вопрос. Поскольку оба GLSL/HLSL использует колонки крупный заказ,

Это правильный способ умножить MATRIX х VECTOR

или

вы можете транспонировать матрицу, используя опцию в

glUniformMatrix4fv (h_Uniforms [UNIFORMS_PROJECTION], 1, GL_FALSE или GL_TRUE, g_proxtrans.s);

По-видимому, это может быть проблемой, чтобы не вызвать эту функцию с параметром (GL_TRUE является использование Транспонирования) каждый каждый кадр просто попробовать.