游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2496|回复: 4

[求助]如何用DIRECTX9 绘制DIB与设备无关的位图?

[复制链接]

7

主题

44

帖子

44

积分

注册会员

Rank: 2

积分
44
QQ
发表于 2006-5-31 12:11:00 | 显示全部楼层 |阅读模式
在OPENGL中只要_dc = ::CreateCompatibleDC(NULL);创建个空的DC就可以把图象绘制到指定位图中.
在DIRECTX中,底层的东西都被封装好了,直接操作对象是DEVICE,哪位大大知道,怎么样才能象OPENGL那样,把图象绘制到一个与设备无关的位图中??
小弟在这先谢过了!!

2

主题

112

帖子

112

积分

注册会员

Rank: 2

积分
112
发表于 2006-5-31 19:56:00 | 显示全部楼层

Re:[求助]如何用DIRECTX9 绘制DIB与设备无关的位图?

一种很麻烦的方法-.-

可以设置RenderTarget,将RenderTarget设置为一个表面,然后再将表面lock之后,读取需要的数据到DIB的数据区中。

另,为何要绘制到DIB呢?DDB转换为DIB很麻烦的,需要根据不同的显示模式作不同的转换。
还有,你说的OpenGL里面创建空DC之后的绘图操作真是把图像绘制到一个DIB上了?难道可以给DIB创建DC么?

7

主题

44

帖子

44

积分

注册会员

Rank: 2

积分
44
QQ
 楼主| 发表于 2006-6-1 08:55:00 | 显示全部楼层

Re:[求助]如何用DIRECTX9 绘制DIB与设备无关的位图?

感谢楼上的回复!

楼上问题,给DIB创建DC,是可以的!
下面是我的测试代码,是用OPENGL渲染出3D图形,把图形绘制在DIB上,然后以流的形式发给WEB客户端,在WEB中显示3D的图象.

OPENGL部分的代码
(C++ CLR)

namespace OpenGLLib {

        public ref class OpenGLClass
        {
        private :
                HDC _dc;
                HWND _hwnd;
                HGLRC _hglrc;
                HBITMAP hBitmap;
        public :
                OpenGLClass(System::IntPtr hwnd)     //此处传入的hwnd,是一个BITMAP,而不是WIN窗体
                {
                        _hwnd = (HWND)(hwnd.ToInt32());
                        _dc = ::GetDC(_hwnd);
                        if(SetPixelFormat(_dc) == 0)
                                return;

                        _hglrc = wglCreateContext(_dc);
                        wglMakeCurrent(_dc, _hglrc);
                       
                }
                OpenGLClass()
                {
                       
                }
                ~OpenGLClass()
                {
                        wglMakeCurrent(NULL, NULL);
                        :eleteObject(hBitmap);
                        wglDeleteContext(_hglrc);
                        ::ReleaseDC(_hwnd, _dc);
                }

                System::IntPtr InitBmp(int w, int h)
                {
                        wglMakeCurrent(NULL, NULL);
                        _dc = ::CreateCompatibleDC(NULL);   //创建空的DC

                        SetBmp(w, h);

                        ::SelectObject(_dc, hBitmap);
                        //_hwnd = (HWND)(hBitmap);
                        //_dc = ::GetDC(_hwnd);
                       
                        if(SetPixelFormat2(_dc) == 0)
                                return IntPtr::Zero;

                        _hglrc = wglCreateContext(_dc);
                        wglMakeCurrent(_dc, _hglrc);
                       
                        return System::IntPtr(hBitmap);
                }

                System::IntPtr ResizeBmp(int w, int h)
                {
                        //Resize(w, h);
                        SetBmp(w, h);       
                        ::SelectObject(_dc, hBitmap);
                        return System::IntPtr(hBitmap);
                }

                void SetBmp(int w, int h)
                {
                        //::DeleteObject(hBitmap);
                        void                           * pBits;
                        BITMAPINFOHEADER *bmih = new BITMAPINFOHEADER();
                        bmih->biSize                  = sizeof (BITMAPINFOHEADER) ;
                        bmih->biWidth                 = w ;
                        bmih->biHeight                = h ;
                        bmih->biPlanes                = 1 ;
                        bmih->biBitCount              = 24 ;
                        bmih->biCompression           = BI_RGB ;
                        bmih->biSizeImage             = 0 ;
                        bmih->biXPelsPerMeter         = 0 ;
                        bmih->biYPelsPerMeter         = 0 ;
                        bmih->biClrUsed               = 0 ;
                        bmih->biClrImportant          = 0 ;

                       
                        hBitmap = CreateDIBSection (_dc, (BITMAPINFO *)  bmih, DIB_PAL_COLORS, &pBits, NULL, 0) ;
                        free(bmih);
                       
                }

                int SetPixelFormat(HDC hdc)
                {
                        PIXELFORMATDESCRIPTOR pfd =
                        {
                                sizeof(PIXELFORMATDESCRIPTOR),
                                1,
                                PFD_DRAW_TO_WINDOW |
                                PFD_SUPPORT_OPENGL |
                                PFD_DOUBLEBUFFER,
                                PFD_TYPE_RGBA,
                                24,
                                0, 0, 0, 0, 0, 0,
                                0,
                                0,
                                0,
                                0, 0, 0, 0,
                                32,
                                0,
                                0,
                                PFD_MAIN_PLANE,
                                0,
                                0, 0, 0
                        };
                       
                        int iPixelFormat;

                        if((iPixelFormat = ::ChoosePixelFormat(hdc, &pfd)) == 0)
                                return 0;

                        if(::SetPixelFormat(hdc, iPixelFormat, &pfd) == FALSE)
                                return 0;

                        return 1;
                }

                int SetPixelFormat2(HDC hdc)
                {
                        PIXELFORMATDESCRIPTOR pfd =
                        {
                                sizeof(PIXELFORMATDESCRIPTOR),
                                1,
                                PFD_DRAW_TO_BITMAP |
                                PFD_SUPPORT_OPENGL |
                                PFD_SUPPORT_GDI,
                                PFD_TYPE_RGBA,
                                24,
                                0, 0, 0, 0, 0, 0,
                                0,
                                0,
                                0,
                                0, 0, 0, 0,
                                32,
                                0,
                                0,
                                PFD_MAIN_PLANE,
                                0,
                                0, 0, 0
                        };
                       
                        int iPixelFormat;

                        if((iPixelFormat = ::ChoosePixelFormat(hdc, &pfd)) == 0)
                                return 0;

                        if(::SetPixelFormat(hdc, iPixelFormat, &pfd) == FALSE)
                                return 0;

                        return 1;
                }

                void DrawObject(void);


                void Resize(int w, int h)
                {
                        glViewport(0, 0, w, h);

                        if(w <= h)
                                gluOrtho2D(0.0, 15.0, 0.0, 15.0 * (GLfloat)h / (GLfloat)w);
                        else
                                gluOrtho2D(0.0, 15.0 * (GLfloat)w / (GLfloat)h, 0.0, 15.0);
                }

               

                void Render()
                {
                        glClearColor(1.0, 1.0, 1.0, 1.0);
                       
                        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
                                /*glBegin(GL_TRIANGLES);
                                glColor3f(0.0, 1.0, 0.0);
                                glVertex2f(2.0, 3.0);
                                glColor3f(0.0, 0.0, 1.0);
                                glVertex2f(12.0, 3.0);
                                glColor3f(1.0, 0.0, 0.0);
                                glVertex2f(7.0, 12.0);
                                glEnd();*/
                                //DrawObject();
s
                        glFlush();
                        SwapBuffers(_dc);
                }

                void Render2()
                {
                        glClearColor(1.0, 1.0, 1.0, 1.0);
                       
                        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
                        /*for(int i = 0; i < 10000; i++)
                        {*/
                                glBegin(GL_TRIANGLES);
                                glColor3f(0.0, 1.0, 0.0);
                                glVertex2f(2.0, 2.0);
                                glColor3f(0.0, 0.0, 1.0);
                                glVertex2f(10.0, 3.0);
                                glColor3f(1.0, 0.0, 0.0);
                                glVertex2f(7.0, 12.0);
                                glEnd();
                                //DrawObject();
                       
                               
                        //}
                        glFlush();
                        //SwapBuffers(_dc);
                }
        };
}

以下是WEB部分的调用
(C#)
public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        
        OpenGLLib.OpenGLClass gl;
        IntPtr hbmp;

        gl = new OpenGLLib.OpenGLClass();

        hbmp = gl.InitBmp(300, 300);
        gl.Resize(300, 300);

        gl.Render();
      

        Bitmap bmp = System.Drawing.Image.FromHbitmap(hbmp);

        Graphics g = Graphics.FromImage(bmp);
        //g.FillRectangle(new SolidBrush(Color.Red), 10, 10, 100, 100); //GDI+混合绘制

        bmp.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg); //以流的方式把BITMAP绘制在WEB窗体上

    }
}

7

主题

44

帖子

44

积分

注册会员

Rank: 2

积分
44
QQ
 楼主| 发表于 2006-6-1 09:02:00 | 显示全部楼层

Re:[求助]如何用DIRECTX9 绘制DIB与设备无关的位图?

由于OPENGL渲染出来的图形效果不如DX9,速度也慢上一点,所以想用DX9来绘制DIB!

在这里强烈BS一下微软,BS一下BILL叔叔.垄断真可怕.

6

主题

110

帖子

110

积分

注册会员

Rank: 2

积分
110
发表于 2006-6-1 11:21:00 | 显示全部楼层

Re:[求助]如何用DIRECTX9 绘制DIB与设备无关的位图?

ddd
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-24 15:31

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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