实例介绍
【实例简介】
【实例截图】
【核心代码】
/* * Copyright (c) 2010, Tae-young Jung * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the <organization>. * 4. Neither the name of the <organization> nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY <COPYRIGHT HOLDER> ''AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ // OpenGLView.cpp : implementation file // #include "stdafx.h" #include "yuvplayer.h" #include "OpenGLView.h" #include <gl/gl.h> // COpenGLView IMPLEMENT_DYNCREATE(COpenGLView, CView) COpenGLView::COpenGLView() { loaded[0] = FALSE; loaded[1] = FALSE; t_width = 0; t_height = 0; ratio = 1.0; } COpenGLView::~COpenGLView() { } BEGIN_MESSAGE_MAP(COpenGLView, CView) ON_WM_CREATE() ON_WM_SIZE() ON_WM_DESTROY() ON_WM_ERASEBKGND() END_MESSAGE_MAP() // COpenGLView drawing void COpenGLView::OnDraw(CDC* pDC) { CDocument* pDoc = GetDocument(); HDC dc = ::GetDC(m_hWnd); int i; // TODO: add draw code here glClear(GL_COLOR_BUFFER_BIT); // clear screen and depth buffer for (i = 0 ; i < 2 ; i ) { if( loaded[i] ){ glBindTexture( GL_TEXTURE_2D, texture[i]); glBegin(GL_QUADS); glTexCoord2f( 0.f, 0.f ); glVertex3i( 0, 0, i); glTexCoord2f( 0.f, 1.f ); glVertex3i( 0, t_height, i); glTexCoord2f( 1.f, 1.f ); glVertex3i( t_width, t_height, i); glTexCoord2f( 1.f, 0.f ); glVertex3i( t_width, 0, i); glEnd(); } } SwapBuffers( dc ); ::ReleaseDC( m_hWnd, dc ); } // COpenGLView diagnostics #ifdef _DEBUG void COpenGLView::AssertValid() const { CView::AssertValid(); } #ifndef _WIN32_WCE void COpenGLView::Dump(CDumpContext& dc) const { CView::Dump(dc); } #endif #endif //_DEBUG // COpenGLView message handlers BOOL COpenGLView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: Modify the Window class or styles here by modifying cs.style |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CS_OWNDC; return CView::PreCreateWindow(cs); } int COpenGLView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here int nPixelFormat; // our pixel format index static PIXELFORMATDESCRIPTOR pfd = { sizeof(PIXELFORMATDESCRIPTOR), // size of structure 1, // default version PFD_DRAW_TO_WINDOW | // window drawing support PFD_SUPPORT_OPENGL | // OpenGL support PFD_DOUBLEBUFFER, // double buffering support PFD_TYPE_RGBA, // RGBA color mode 32, // 32 bit color mode 0, 0, 0, 0, 0, 0, // ignore color bits, non-palettized mode 0, // no alpha buffer 0, // ignore shift bit 0, // no accumulation buffer 0, 0, 0, 0, // ignore accumulation bits 0, // no z-buffer size 0, // no stencil buffer 0, // no auxiliary buffer PFD_MAIN_PLANE, // main drawing plane 0, // reserved 0, 0, 0 }; // layer masks ignored HDC hdc = ::GetDC(m_hWnd); nPixelFormat = ChoosePixelFormat(hdc, &pfd); BOOL success = SetPixelFormat(hdc, nPixelFormat, &pfd); m_hRC = wglCreateContext(hdc); wglMakeCurrent(hdc, m_hRC); glDisable(GL_DEPTH_TEST); glEnable(GL_TEXTURE_2D); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glGenTextures( 2, texture ); glBindTexture(GL_TEXTURE_2D, texture[0] ); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glBindTexture(GL_TEXTURE_2D, texture[1] ); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glClearColor(0,0,0,0); return 0; } void COpenGLView::OnSize(UINT nType, int cx, int cy) { CView::OnSize(nType, cx, cy); // TODO: Add your message handler code here glViewport( 0, 0, cx, cy ); glMatrixMode(GL_PROJECTION); // set projection matrix current matrix glLoadIdentity(); glOrtho( 0, cx, cy, 0, 0, 100); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef( 0, 0, -10.0f ); glScalef( ratio, ratio, 1.f ); } void COpenGLView::OnDestroy() { CView::OnDestroy(); // TODO: Add your message handler code here wglDeleteContext(m_hRC); } void COpenGLView::SetParam(int width, int height, float ratio) { for( t_width = 2 ; t_width < width ; t_width *= 2 ); for( t_height = 2 ; t_height < height ; t_height *= 2 ); this->ratio = ratio; loaded[0] = FALSE; loaded[1] = FALSE; } void COpenGLView::LoadTexture(unsigned char* rgba) { glBindTexture(GL_TEXTURE_2D, texture[0] ); if( loaded[0] ) glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, t_width, t_height, GL_RGBA, GL_UNSIGNED_BYTE, rgba ); else { glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, t_width, t_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgba ); loaded[0] = TRUE; } Invalidate(NULL); } void COpenGLView::LoadSegmentTexture(unsigned char* segment) { glBindTexture(GL_TEXTURE_2D, texture[1] ); if( loaded[1] ) glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, t_width, t_height, GL_RGBA, GL_UNSIGNED_BYTE, segment ); else{ glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, t_width, t_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, segment ); loaded[1] = TRUE; } Invalidate(NULL); } BOOL COpenGLView::OnEraseBkgnd(CDC* pDC) { // TODO: Add your message handler code here and/or call default return TRUE; //return CView::OnEraseBkgnd(pDC); }
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论