如何从二进制图像在OpenGL中绘制形状?

加布里埃尔·科西(Gabriele Corsi)

我需要从二进制图像在OpenGL中绘制形状。例如,我有此图像二进制

我需要在OpenGL中绘制此形状。事实是,我需要“动态地”执行此操作,因此,例如,每秒我将拥有一个不同的二进制图像,并且需要从这些图像中的每个图像中绘制形状。形状将不是示例图像中唯一的三角形。我将在Android Studio中使用它。

非洲文化

将此图像转换为Bitmap对象并在上绘制GLSurfaceView您可以像这样在着色器代码中检查条件。

 vec4 color = texture2D(uTexture, vTexPosition);
 if(color.r == 0.0 && color.g == 0.0 && color.b == 0.0)
  color = vec4(1.0,0.5,0.5,1.0);
 gl_FragColor = color;

这是完整的GLRenderer

public class GLRenderer implements GLSurfaceView.Renderer {

    private static final String TAG = "MyGLRenderer";
    private float[] vertices = {
            -1f, -1f,
            1f, -1f,
            -1f, 1f,
            1f, 1f
    };

    private float[] textureVertices = {
            0f, 1f,
            1f, 1f,
            0f, 0f,
            1f, 0f
    };

    private final String vertexShaderCode =
            "attribute vec4 aPosition;" +
                    "attribute vec2 aTexPosition;" +
                    "varying vec2 vTexPosition;" +
                    "void main() {" +
                    "  gl_Position = aPosition;" +
                    "  vTexPosition = aTexPosition;" +
                    "}";

    private final String fragmentShaderCode =
            "precision mediump float;" +
                    "uniform sampler2D uTexture;" +
                    "varying vec2 vTexPosition;" +
                    "void main() {\n" +
                    "vec4 color = texture2D(uTexture, vTexPosition);\n"+
                    "if(color.r == 0.0 && color.g == 0.0 && color.b == 0.0)\n"+
                    "color = vec4(1.0,0.5,0.5,1.0);"+
                    "  gl_FragColor = color;" +
                    "}";

    private FloatBuffer verticesBuffer;
    private FloatBuffer textureBuffer;


    private int vertexShader;
    private int fragmentShader;
    private int program;

    private Bitmap bmp;
    private int textures[] = new int[2];
    // mMVPMatrix is an abbreviation for "Model View Projection Matrix"
    private final float[] mMVPMatrix = new float[16];
    private final float[] mProjectionMatrix = new float[16];
    private final float[] mViewMatrix = new float[16];
    private final float[] mRotationMatrix = new float[16];

    public GLRenderer() {
        bmp=Bitmap.createBitmap(513,912, Bitmap.Config.ARGB_8888);
    }

    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
        checkGlError("glClearColor");
        setup();
    }

    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        GLES20.glViewport(0, 0, width, height);

        float ratio = (float) width / height;
        Matrix.frustumM(mProjectionMatrix, 0, -ratio, ratio, -1, 1, 3, 7);

    }

    @Override
    public void onDrawFrame(GL10 gl) {
        Log.d("Drawing_Frame","Working");
        float[] scratch = new float[16];

        // Draw background color
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);

        // Set the camera position (View matrix)
        Matrix.setLookAtM(mViewMatrix, 0, 0, 0, -3, 0f, 0f, 0f, 0f, 1.0f, 0.0f);

        // Calculate the projection and view transformation
        Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mViewMatrix, 0);

        // Draw Bitmap
        drawBinaryImage(bmp,textures[0]);
        Matrix.setRotateM(mRotationMatrix, 0, 0, 0, 0, 1.0f);
        Matrix.multiplyMM(scratch, 0, mMVPMatrix, 0, mRotationMatrix, 0);

    }

    private void setup(){
        GLES20.glGenTextures(2, textures, 0);
        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textures[0]);

        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
        GLES20.glTexParameteri(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_CLAMP_TO_EDGE);
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
        GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bmp, 0);
        //GLES20.glBindTexture(GL);
        initializeBuffers();
        initializeProgram();



    }


    private void initializeBuffers() {
        ByteBuffer buff = ByteBuffer.allocateDirect(vertices.length * 4);
        buff.order(ByteOrder.nativeOrder());
        verticesBuffer = buff.asFloatBuffer();
        verticesBuffer.put(vertices);
        verticesBuffer.position(0);

        buff = ByteBuffer.allocateDirect(textureVertices.length * 4);
        buff.order(ByteOrder.nativeOrder());
        textureBuffer = buff.asFloatBuffer();
        textureBuffer.put(textureVertices);
        textureBuffer.position(0);
    }
    private void initializeProgram() {
        vertexShader = GLES20.glCreateShader(GLES20.GL_VERTEX_SHADER);
        GLES20.glGetShaderInfoLog(vertexShader);
        checkGlError("glCreateShader");
        GLES20.glShaderSource(vertexShader, vertexShaderCode);
        GLES20.glCompileShader(vertexShader);

        fragmentShader = GLES20.glCreateShader(GLES20.GL_FRAGMENT_SHADER);
        GLES20.glShaderSource(fragmentShader, fragmentShaderCode);
        GLES20.glCompileShader(fragmentShader);

        program = GLES20.glCreateProgram();
        GLES20.glAttachShader(program, vertexShader);
        GLES20.glAttachShader(program, fragmentShader);

        GLES20.glLinkProgram(program);
        checkGlError("glLinkProgram");

    }
    public void updateTexture(Bitmap bmp){
        GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bmp, 0);
    }
    private void drawBinaryImage(Bitmap bmp,int texture){
        GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);
        GLES20.glUseProgram(program);
        //Changes Here original Line GLES20.glDisable(GLES20.GL_BLEND);
        GLES20.glDisable(GLES20.GL_CULL_FACE);
        GLES20.glDisable(GLES20.GL_DEPTH_TEST);
        GLES20.glEnable(GLES20.GL_BLEND);
        GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ONE);

        int positionHandle = GLES20.glGetAttribLocation(program, "aPosition");
        int textureHandle = GLES20.glGetUniformLocation(program, "uTexture");
        int texturePositionHandle = GLES20.glGetAttribLocation(program, "aTexPosition");
        //Log.d("GL_SETUP",positionHandle+" , "+textureHandle);
        GLES20.glVertexAttribPointer(texturePositionHandle, 2, GLES20.GL_FLOAT, false, 0, textureBuffer);
        GLES20.glEnableVertexAttribArray(texturePositionHandle);

        GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texture);
        Log.d("FILTER_APPLY","Applying");
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER,GLES20.GL_LINEAR);
        GLES20.glUniform1i(textureHandle, 0);

        GLES20.glVertexAttribPointer(positionHandle, 2, GLES20.GL_FLOAT, false, 0, verticesBuffer);
        GLES20.glEnableVertexAttribArray(positionHandle);

        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
        GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
        checkGlError("glDrawArrays");
    }

    public void setBitmap(Bitmap bitmap){
        updateTexture(bitmap);
        this.bmp = bitmap;
    }
    public static void checkGlError(String glOperation) {
        int error;
        while ((error = GLES20.glGetError()) != GLES20.GL_NO_ERROR) {
            Log.e(TAG, glOperation + ": glError " + error);
            throw new RuntimeException(glOperation + ": glError " + error);
        }
    }
}

将此渲染器与 GlSurfaceView

这是主要的活动课

public class MainActivity extends AppCompatActivity {

    FrameLayout glView;
    private GLRenderer renderer;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        glView = findViewById(R.id.glview);
        setupGL();
    }

    private void setupGL(){
        renderer = new GLRenderer();
        //MyGlSurfaceView glSurfaceView = new MyGlSurfaceView(this,renderer);
        GLSurfaceView glSurfaceView = new GLSurfaceView(this);
        glSurfaceView.setEGLContextClientVersion(2);
        glSurfaceView.setRenderer(renderer);
        glView.addView(glSurfaceView);
        produceFrame();
    }

    private void produceFrame(){
        Bitmap bmp = BitmapFactory.decodeResource(getResources(),R.drawable.sample);
        renderer.setBitmap(bmp);
    }

您可以检查项目是否完整。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在matlab中的灰色二进制图像内绘制矩形

来自分类Dev

如何在matlab中的灰色二进制图像内绘制矩形

来自分类Dev

如何找到二进制图像中的行?

来自分类Dev

如何将具有选定像素的形状分成二进制图像中的两个部分

来自分类Dev

在MATLAB中以二进制图像突出显示某些形状的边界

来自分类Dev

如何生成随机的二进制图像?

来自分类Dev

二进制图像中的偏斜字符

来自分类Dev

检测二进制图像中的“周围”区域

来自分类Dev

提取二进制图像中的重叠对象

来自分类Dev

Django模板中的二进制图像显示

来自分类Dev

我如何消除此二进制图像中的噪声并平滑图像-openCV

来自分类Dev

如何在MATLAB中获取二进制图像中字符的外周边?

来自分类Dev

如何在MATLAB中获取二进制图像中字符的外周长?

来自分类Dev

如何在 OpenCV 中填充二进制图像中的空白?

来自分类Dev

如何检测二进制图像RGB中的圆?

来自分类Dev

如何找到二进制图像中对象的周长?

来自分类Dev

如何在SQL中获取二进制图像

来自分类Dev

如何在python中居中二进制图像的内容/对象?

来自分类Dev

如何在objcopy生成的二进制图像文件中获取入口地址?

来自分类Dev

如何消除二进制图像中的噪点?

来自分类Dev

如何检测二进制图像RGB中的圆?

来自分类Dev

如何找到二进制图像中对象的周长?

来自分类Dev

如何转换二进制图像并将其显示在Repeater中?

来自分类Dev

如何删除与二进制图像中其余字符距离最远的数字/非字符

来自分类Dev

如何从odoo中的二进制图像获取完整路径

来自分类Dev

如何在SQL中获取二进制图像

来自分类Dev

根据二进制图像裁剪图像-Matlab

来自分类Dev

如何使用php将图像转换为二进制图像?

来自分类Dev

如何在PHRETS中将二进制图像数据显示为图像

Related 相关文章

  1. 1

    如何在matlab中的灰色二进制图像内绘制矩形

  2. 2

    如何在matlab中的灰色二进制图像内绘制矩形

  3. 3

    如何找到二进制图像中的行?

  4. 4

    如何将具有选定像素的形状分成二进制图像中的两个部分

  5. 5

    在MATLAB中以二进制图像突出显示某些形状的边界

  6. 6

    如何生成随机的二进制图像?

  7. 7

    二进制图像中的偏斜字符

  8. 8

    检测二进制图像中的“周围”区域

  9. 9

    提取二进制图像中的重叠对象

  10. 10

    Django模板中的二进制图像显示

  11. 11

    我如何消除此二进制图像中的噪声并平滑图像-openCV

  12. 12

    如何在MATLAB中获取二进制图像中字符的外周边?

  13. 13

    如何在MATLAB中获取二进制图像中字符的外周长?

  14. 14

    如何在 OpenCV 中填充二进制图像中的空白?

  15. 15

    如何检测二进制图像RGB中的圆?

  16. 16

    如何找到二进制图像中对象的周长?

  17. 17

    如何在SQL中获取二进制图像

  18. 18

    如何在python中居中二进制图像的内容/对象?

  19. 19

    如何在objcopy生成的二进制图像文件中获取入口地址?

  20. 20

    如何消除二进制图像中的噪点?

  21. 21

    如何检测二进制图像RGB中的圆?

  22. 22

    如何找到二进制图像中对象的周长?

  23. 23

    如何转换二进制图像并将其显示在Repeater中?

  24. 24

    如何删除与二进制图像中其余字符距离最远的数字/非字符

  25. 25

    如何从odoo中的二进制图像获取完整路径

  26. 26

    如何在SQL中获取二进制图像

  27. 27

    根据二进制图像裁剪图像-Matlab

  28. 28

    如何使用php将图像转换为二进制图像?

  29. 29

    如何在PHRETS中将二进制图像数据显示为图像

热门标签

归档