OpenGL ES 2.0 シェーダーに送信された SurfaceTexture を介して GLSurfaceView にカメラ ストリームを表示しようとしています。
この投稿からインスピレーションを得ました。
画像は完成しましたが、タブレットに正しく表示されません。画面が 2x2 に分割されているように見えます。画像は左上の部分に表示され、残りの 3 つの部分は黒です。
問題は、ここに記載されているシーケンスによって返される変換行列の使用に起因すると思われます
updateTexImage();
getTransformMatrix(...);
このマトリックスを頂点シェーダーに送信して、フラグメント シェーダーのテクスチャ座標を生成します。
頂点シェーダー:
attribute vec3 aPosition;
uniform mat4 uMvpTransform;
// Matrix retrieved by getTransformMatrix(...);
uniform mat4 uTexMatTransform;
varying vec2 vTexCoord;
void main(void)
{
gl_Position = uMvpTransform *vec4(aPosition.xyz, 1);
vec4 l_tex = uTexMatTransform*vec4(aPosition.xyz, 1);
vTexCoord=l_tex.xy;
}
フラグメント シェーダー:
#extension GL_OES_EGL_image_external : require
varying mediump vec2 vTexCoord;
uniform samplerExternalOES uSampler;
void main(void)
{
mediump vec4 l_tex = texture2D(uSampler, vTexCoord);
gl_FragColor=l_tex;
}
テクスチャは次の正方形に取り付けられます。
// Image container
GLfloat l_vertices[] = {
-1.0f, 1.0f, 0.0f,
-1.0f, -1.0f, 0.0f,
1.0f, -1.0f, 0.0f,
1.0f, 1.0f, 0.0f };
誰かが似たようなことを達成しましたか?
2012 年 11 月 3 日編集:
頂点シェーダーの修正:
attribute vec3 aPosition;
attribute vec2 aTexCoord;
uniform mat4 uMvpTransform;
// Matrix retrieved by getTransformMatrix(...);
uniform mat4 uTexMatTransform;
varying vec2 vTexCoord;
void main(void)
{
gl_Position = uMvpTransform *vec4(aPosition.xyz, 1);
vec4 l_tex = uTexMatTransform*vec4(aTexCoord.xy,0, 1);
vTexCoord=l_tex.xy;
}
と:
// Texture
GLfloat l_texCoord[] = {
0.0f, 1.0f,
0.0f, 0.0f,
1.0f, 0.0f,
1.0f, 1.0f
};