Executor
>Там есть GL3 расширения? ARB FBO например ты везде юзаешь.
эээм, ну FBO там точно есть - там даже демки с сайта на FBO закручены ))
Не поленился, скачал последнюю демку - все есть ) блин, даже, пример как делать есть оО, там демка новая - монстр крутится и на полу его отражение, так вот там юзается и renderBuffer и frameBuffer и все видно, как верно делать :/, но как бы то ни было, я уже сам сделал )
> Категорически нет!
> Никто тебе не гарантирует, что дефайн GL_EXT_ABC и GL_ARB_ABC будут одинаковыми.
> Мешать функции тоже нельзя. Такое может взлететь только в специфичных случаях и то никто ничего при этом не будет гарантировать.
> Если ты юзаешь например ARB_FBO то мешать его с EXT_FBO не нужно.
Спасибо!
toAll:
Вобщем сделал - все работает ! всем спасибо ;)
чето я не думал, что apple будет делать такие демки ...
У Apple самый худший OpenGL среди всех платформ.
I конечно доволен а вот у меня ни чего ещё не решилось )
В общем, решил и я покурить OpenGL. Кубики/треугольники нарисова - вообще конечно не проблема. А вот этот же рендер в текстуру не работает : )
вот код - он достаточно простой! Всё что я хочу им сделать - создать рендер-таргет (ну как там в GL называется, фреймбуфер с приаттаченой текстурой..х.з.), _просто очистить его_ любым цветом и вывести натянутым на квад! вот и всё!
// OpenGL.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <gl/glew.h> #include <Windows.h> #include "RenderWindow.h" GLvoid ResizeWindow(GLsizei width, GLsizei height) { if( height == 0) height = 1; glViewport( 0,0,width, height); glMatrixMode( GL_PROJECTION); glLoadIdentity( ); gluPerspective( 45.0f, ( float)width / ( float)height, 0.1f, 300.0f); glMatrixMode( GL_MODELVIEW); glLoadIdentity( ); gluLookAt( 0,3,7,0,0,0,0,1,0); } int _tmain( int argc, _TCHAR* argv[]) { RenderWindow rw( 640,480); rw.SetCaption( STR( "First OpenGL app")); rw.SetOGLPixelFormat( ); HDC dc = rw.GetHDC( ); HGLRC glRC = wglCreateContext( dc); if( !wglMakeCurrent( dc, glRC ) ) // Попробовать активировать Контекст Рендеринга { MessageBox( NULL, "Can't Activate The GL Rendering Context.", "ERROR", MB_OK | MB_ICONEXCLAMATION ); } bool running = true; glShadeModel( GL_SMOOTH ); glClearColor( 1.0f, 0.0f, 0.0f, 0.0f); glClearDepth( 1.0f ); //glEnable( GL_DEPTH_TEST ); //glDepthFunc( GL_LESS ); glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST ); ResizeWindow( 640, 480); float angle = 0.0f; GLuint texture; GLuint renderBuffer; GLuint frameBuffer; GLenum err = glewInit( ); if ( GLEW_OK != err) { fprintf( stderr, "Error: %s\n", glewGetErrorString( err)); } //gen frame buffer glGenFramebuffers( 1, &frameBuffer); glBindFramebuffer( GL_FRAMEBUFFER, frameBuffer); //gen render buffer glGenRenderbuffersEXT( 1, &renderBuffer); glBindRenderbuffer( GL_RENDERBUFFER, renderBuffer); glRenderbufferStorage( GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, 640, 480); glFramebufferRenderbuffer ( GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, renderBuffer); //gen texture glGenTextures( 1, &texture); glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST ); glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST ); glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP ); glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP ); glTexImage2D ( GL_TEXTURE_2D, 0, GL_RGBA8, 640, 480, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0 ); glFramebufferTexture2D( GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0 ); glEnable( GL_TEXTURE_2D); glCullFace( GL_BACK); glFrontFace( GL_CCW); while( running) { angle +=2.0f; rw.Update( ); glClearColor( 1.0f, 1.0f, 0.0f, 0.0f); //ставим рендер таргет glBindFramebuffer ( GL_FRAMEBUFFER, frameBuffer); glViewport ( 0, 0, 640, 480), glDrawBuffer ( GL_COLOR_ATTACHMENT0); glReadBuffer ( GL_COLOR_ATTACHMENT0); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); //сбросим трансформации glMatrixMode( GL_PROJECTION); glLoadIdentity( ); glMatrixMode( GL_MODELVIEW); glLoadIdentity( ); //ставим бэкбуфер glClearColor( 1.0f, 0.0f, 0.0f, 0.0f); glBindFramebuffer( GL_DRAW_FRAMEBUFFER, 0); glDrawBuffer ( GL_BACK); glReadBuffer ( GL_BACK); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); //рендер квада с текстурой glCullFace( GL_NONE); glBindTexture( GL_TEXTURE_2D, texture); //биндим текстуру рендер таргета glBegin( GL_QUADS); glTexCoord2f( 0.0f, 0.0f); glVertex3f( -1.0f, 0.0f, 1.0f); glTexCoord2f( 1.0f, 0.0f); glVertex3f( 0.0f, 0.0f, 1.0f); glTexCoord2f( 1.0f, 1.0f); glVertex3f( 0.0f, 1.0f, 1.0f); glTexCoord2f( 0.0f, 1.0f); glVertex3f( -1.0f, 1.0f, 1.0f); glEnd( ); SwapBuffers( dc); } return 0; }
Собсно вот. Я очищаю рендер таргет и рисую его на кваде. В итоге квад белый! : \ Будто очистка текстуры не сработала - не понимаю в чём дело.
Что glGetError() говорит? Что говорит фреймбуфер статус?
Кстати попутный вопрос. Разве glDrawBuffer/glReadBuffer не "запоминается" вместе с фреймбуфером?
Другими словами разве надо их каждый раз восстанавливать после отключения ФБО если включаешь их только после бинда фрейбуфера?
DeadMeat
> Разве glDrawBuffer/glReadBuffer не "запоминается" вместе с фреймбуфером?
Запоминаются.
> Другими словами разве надо их каждый раз восстанавливать после отключения ФБО
> если включаешь их только после бинда фрейбуфера?
Не надо.
DeadMeat
> Разве glDrawBuffer/glReadBuffer не "запоминается" вместе с фреймбуфером?
Не обязательно.
> Другими словами разве надо их каждый раз восстанавливать после отключения ФБО
> если включаешь их только после бинда фрейбуфера?
Настоятельно рекомендуется. Плохо никому не станет.
Executor помог с проблемой за что ему большое спасибо ) Вроде вопросов больше нет : )
А в OpenGL можно рендер глубины в текстуру направить, а цвет при этом в back buffer обычный ?
все не осилил, попробуйте после бинда буфера и подключени текстур glEnable(GL_TEXTURE_2D), glEnable(GL_DEPTH_TEST);
Тема в архиве.