中文第一计算机图形学社区OpenGPU 版权所有2007-2018

 找回密码
 注册

扫一扫,访问微社区

搜索
查看: 4293|回复: 10

求助关于GPU实现图像旋转、镜像~

[复制链接]
发表于 2014-7-27 23:52:46 | 显示全部楼层 |阅读模式
   大家好,我是刚入门GPU的一个新手。现在手头上有个项目要实现GPU的图像旋转,图像格式是NV12.
  我现在是完成无从下手,图像旋转、镜像CPU我是能实现。但是GPU要怎么来弄呀?图像中每一个像素点的值在GPU怎么来存放呢??
我怎么把CPU上的图像数据传到GPU呢?以及定位GPU中图像数据相关的像素点的坐标呢?
发表于 2014-7-28 02:08:32 | 显示全部楼层
将内存中的图像当作一个2D纹理传入显存,绘制一个矩形,用纹理填充矩形。图像的旋转和镜像只要对矩形的点进行操作即可。
发表于 2014-8-23 01:21:14 | 显示全部楼层
2楼正解。
发表于 2015-12-3 15:47:25 | 显示全部楼层
直接用内存缓冲的形式传入也可以
发表于 2015-12-8 18:02:52 | 显示全部楼层


    public static final float TEXTURE_NO_ROTATION[] = {
            0.0f, 1.0f,
            1.0f, 1.0f,
            0.0f, 0.0f,
            1.0f, 0.0f,
    };

    public static final float TEXTURE_ROTATED_90[] = {
            1.0f, 1.0f,
            1.0f, 0.0f,
            0.0f, 1.0f,
            0.0f, 0.0f,
    };
    public static final float TEXTURE_ROTATED_180[] = {
            1.0f, 0.0f,
            0.0f, 0.0f,
            1.0f, 1.0f,
            0.0f, 1.0f,
    };
    public static final float TEXTURE_ROTATED_270[] = {
            0.0f, 0.0f,
            0.0f, 1.0f,
            1.0f, 0.0f,
            1.0f, 1.0f,
    };

    public static float[] getRotation(final Rotation rotation, final boolean flipHorizontal,
                                                         final boolean flipVertical) {
        float[] rotatedTex;
        switch (rotation) {
            case ROTATION_90:
                rotatedTex = TEXTURE_ROTATED_90;
                break;
            case ROTATION_180:
                rotatedTex = TEXTURE_ROTATED_180;
                break;
            case ROTATION_270:
                rotatedTex = TEXTURE_ROTATED_270;
                break;
            case NORMAL:
            default:
                rotatedTex = TEXTURE_NO_ROTATION;
                break;
        }
        if (flipHorizontal) {
            rotatedTex = new float[]{
                    flip(rotatedTex[0]), rotatedTex[1],
                    flip(rotatedTex[2]), rotatedTex[3],
                    flip(rotatedTex[4]), rotatedTex[5],
                    flip(rotatedTex[6]), rotatedTex[7],
            };
        }
        if (flipVertical) {
            rotatedTex = new float[]{
                    rotatedTex[0], flip(rotatedTex[1]),
                    rotatedTex[2], flip(rotatedTex[3]),
                    rotatedTex[4], flip(rotatedTex[5]),
                    rotatedTex[6], flip(rotatedTex[7]),
            };
        }
        return rotatedTex;
    }
发表于 2016-1-18 14:43:35 | 显示全部楼层
bzerg 发表于 2014-7-28 02:08
将内存中的图像当作一个2D纹理传入显存,绘制一个矩形,用纹理填充矩形。图像的旋转和镜像只要对矩形的点进 ...

您好,我属于初学者,想了解一下有什么书籍介绍这些基本操作的
发表于 2016-3-10 10:12:26 | 显示全部楼层
详细,awesome
发表于 2016-4-28 23:41:24 | 显示全部楼层
easyma 发表于 2016-1-18 14:43
您好,我属于初学者,想了解一下有什么书籍介绍这些基本操作的

任何一本OpenGL/DX的书籍都有说明。
发表于 2016-5-4 23:46:57 | 显示全部楼层
正在学习中,不错
发表于 2016-5-25 09:37:38 | 显示全部楼层
也在看,学习中
发表于 2016-5-25 09:37:38 | 显示全部楼层
也在看,学习中
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|关于我们|小黑屋|Archiver|手机版|中文第一计算机图形学社区OpenGPU

GMT+8, 2019-1-23 16:28 , Processed in 0.067691 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表