Войти
ПрограммированиеФорумГрафика

OpenGL: проблемы с рендером в текстуру и depth-тестом (4 стр)

Страницы: 1 2 3 4
#45
0:19, 13 апр 2011

Executor
>Там есть GL3 расширения? ARB FBO например ты везде юзаешь.
эээм, ну FBO там точно есть - там даже демки с сайта на FBO закручены ))

Не поленился, скачал последнюю демку - все есть ) блин, даже, пример как делать есть оО, там демка новая - монстр крутится и на полу его отражение, так вот там юзается и renderBuffer и frameBuffer и все видно, как верно делать :/, но как бы то ни было, я уже сам сделал )

> Категорически нет!
> Никто тебе не гарантирует, что дефайн GL_EXT_ABC и GL_ARB_ABC будут одинаковыми.
> Мешать функции тоже нельзя. Такое может взлететь только в специфичных случаях и то никто ничего при этом не будет гарантировать.
> Если ты юзаешь например ARB_FBO то мешать его с EXT_FBO не нужно.
Спасибо!

toAll:
Вобщем сделал - все работает ! всем спасибо ;)

чето я не думал, что apple будет делать такие демки ...

#46
0:37, 13 апр 2011

У Apple самый худший OpenGL среди всех платформ.

#47
13:21, 13 апр 2011

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;
}

Собсно вот.  Я очищаю  рендер таргет и рисую его на кваде.  В итоге квад белый! : \  Будто очистка текстуры не сработала - не понимаю в чём дело.

#48
14:04, 13 апр 2011

Что glGetError() говорит? Что говорит фреймбуфер статус?

#49
16:54, 13 апр 2011

Кстати попутный вопрос. Разве glDrawBuffer/glReadBuffer не "запоминается" вместе с фреймбуфером?
Другими словами разве надо их каждый раз восстанавливать после отключения ФБО если включаешь их только после бинда фрейбуфера?

#50
17:20, 13 апр 2011

DeadMeat
> Разве glDrawBuffer/glReadBuffer не "запоминается" вместе с фреймбуфером?

Запоминаются.

> Другими словами разве надо их каждый раз восстанавливать после отключения ФБО
> если включаешь их только после бинда фрейбуфера?

Не надо.

#51
19:53, 13 апр 2011

DeadMeat
> Разве glDrawBuffer/glReadBuffer не "запоминается" вместе с фреймбуфером?
Не обязательно.

> Другими словами разве надо их каждый раз восстанавливать после отключения ФБО
> если включаешь их только после бинда фрейбуфера?
Настоятельно рекомендуется. Плохо никому не станет.

#52
0:41, 14 апр 2011

Executor помог с проблемой за что ему большое спасибо )  Вроде вопросов больше нет : )

Прошло более 1 года
#53
15:30, 7 апр 2013

А в OpenGL можно рендер глубины в текстуру направить, а цвет при этом в back buffer обычный ?

#54
16:01, 7 апр 2013

все не осилил, попробуйте после бинда буфера и подключени текстур glEnable(GL_TEXTURE_2D), glEnable(GL_DEPTH_TEST);

Страницы: 1 2 3 4
ПрограммированиеФорумГрафика

Тема в архиве.