Проблема с инициализацией OpenGL-приложения. - Nalchik On Line - Форум Нальчика и КБР
Nalchik On Line - Форум Нальчика и КБР
Вернуться   Nalchik On Line - Форум Нальчика и КБР > Hard & Soft > Soft > Developing
Перезагрузить страницу Проблема с инициализацией OpenGL-приложения.
Ответ
Опции темы
  (#1) Непрочитано
grand Master
Аватар для Parad0
Сообщений: 4,936
Регистрация: 01.10.2006
Репутация: 222 Рейтинг
Проблема с инициализацией OpenGL-приложения. - 07.05.2008, 19:36

Собственно, написал программу моделирования неких природных явлений с применением OGL.
После запуска выдает: Error - extension ARB_pixel_buffer_object not supported.
Видео - Radeon 9600 XT.
В чем проблема? Как проинициализировать данное OGL-расширение?
Может, проблема в драйверах?


Ответить с цитированием
  (#2) Непрочитано
фильтикультяплинивик
grand Master
Аватар для DeadMeat
Сообщений: 3,487
Регистрация: 28.09.2004
Адрес: Нальчик
Возраст: 36
Репутация: 33 Рейтинг
07.05.2008, 20:07

Parad0
Угу. В драйверах. А на чем писал? И зачем юзал PBuffer? Показывай код....


"Mad girlfriend bug", is a bug whose immediate effect remains hidden - the app outwardly seems to function normally and tells you that everything is fine.
Ответить с цитированием
  (#3) Непрочитано
grand Master
Аватар для Parad0
Сообщений: 4,936
Регистрация: 01.10.2006
Репутация: 222 Рейтинг
07.05.2008, 20:46

DeadMeat
На Вижл Си++. СобССно, еще не доделал до конца. Делал рендеринг воды.
Попытался рализовать рендеринг в вершинный буфер, да и хотелось быстро строить изменяющиеся на каждом шаге вершинные массивы очень большого размера не перегружая при этом ни CPU, ни видюху.

Код:
#include    "libExt.h" //- вот тут они и есть, расширения
#include    <glut.h>
#include    <stdio.h>
#include    <stdlib.h>
#include    "libTexture.h"
#include    "libTexture3D.h"
#include    "TypeDefs.h"
#include	"Vector4D.h"
#include    "Vector3D.h"
#include    "Vector2D.h"
#include    "boxes.h"
#include    "GlslProgram.h"
#include    "Camera.h"
#include	"FrameBuffer.h"
#include	"VertexBuffer.h"
#include	"utils.h"
#include	"fpTexture.h"

#define		SIZE 16
#define		TEX_SIZE	128

Vector3D    eye   ( 0, 0, 0 );  		
unsigned	noiseMap;
  unsigned	  reflectionMap;
float		yaw   = 0;
float		pitch = 0;
float		roll  = 0;
float		amplitude   = 0.1;
bool        useFilter   = true;
bool		useRotation = true;
int		 	object      = 0;
Vector3D	eta ( 1.05, 1.1, 1.15 );

GLenum		mapFormat;				
unsigned	verticesMap;			
unsigned	normalsMap;			
FrameBuffer	buffer  ( TEX_SIZE, TEX_SIZE );
GlslProgram	r2vb;
GlslProgram program;
Camera		camera ( eye, yaw, pitch, roll );	

VertexBuffer	* vertexBuffer;	
VertexBuffer    * normalBuffer;		
VertexBuffer	* indexBuffer;	

void reshape ( int w, int h );


float	* buf = (float *) malloc ( TEX_SIZE * TEX_SIZE * 4 * sizeof ( float ) );

void	createIndexBuffer ()
{
	int * data = (int *) malloc ( (TEX_SIZE-1)*(TEX_SIZE-1)*6*sizeof (int) );
	int	  k    = 0;
	
	for ( int i = 0; i < TEX_SIZE - 1; i++ )
		for ( int j = 0; j < TEX_SIZE - 1; j++ )
		{
			data [k]   = i + TEX_SIZE*j;	
			data [k+1] = i + TEX_SIZE*j + 1;
			data [k+2] = i + TEX_SIZE*j + TEX_SIZE;
			
			data [k+3] = i + TEX_SIZE*j + 1;
			data [k+4] = i + TEX_SIZE*j + TEX_SIZE + 1;
			data [k+5] = i + TEX_SIZE*j + TEX_SIZE;
			
			k += 6;
		}
		
	indexBuffer = new VertexBuffer ();
	
	indexBuffer -> bind    ( GL_ELEMENT_ARRAY_BUFFER_ARB );
	indexBuffer -> setData ( (TEX_SIZE - 1) * (TEX_SIZE - 1) * 6 * sizeof ( int ), data, GL_STATIC_DRAW );
	indexBuffer -> unbind  ();
	
	free ( data );
}

void	createVertexBuffer ()
{
	vertexBuffer = new VertexBuffer ();
	
	vertexBuffer -> bind    ( GL_PIXEL_PACK_BUFFER_ARB );
	vertexBuffer -> setData ( buffer.getWidth () * buffer.getHeight () * 4 * sizeof ( float ), NULL, GL_DYNAMIC_DRAW );
	vertexBuffer -> unbind  ();
}

void	createNormalBuffer ()
{
	normalBuffer = new VertexBuffer ();
	
	normalBuffer -> bind    ( GL_PIXEL_PACK_BUFFER_ARB );
	normalBuffer -> setData ( buffer.getWidth () * buffer.getHeight () * 4 * sizeof ( float ), NULL, GL_DYNAMIC_DRAW );
	normalBuffer -> unbind  ();
}


void	buildVertices ()
{
	GLenum	buffers [] = { GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT };

								
	glActiveTextureARB ( GL_TEXTURE0_ARB );
    glBindTexture      ( GL_TEXTURE_3D, noiseMap );

	r2vb.bind      ();				
	buffer.bind    ();
	glDrawBuffers  ( 2, buffers );
	startOrtho     ( TEX_SIZE, TEX_SIZE );
	drawQuad       ( TEX_SIZE, TEX_SIZE );
	endOrtho       ();
	r2vb.unbind    ();

							
	glReadBuffer           ( GL_COLOR_ATTACHMENT0_EXT );
	vertexBuffer -> bind   ( GL_PIXEL_PACK_BUFFER_ARB );
	glReadPixels           ( 0, 0, TEX_SIZE, TEX_SIZE, GL_RGBA, GL_FLOAT, NULL );
	vertexBuffer -> unbind ();

	glReadBuffer           ( GL_COLOR_ATTACHMENT1_EXT );
	normalBuffer -> bind   ( GL_PIXEL_PACK_BUFFER_ARB );
	glReadPixels           ( 0, 0, TEX_SIZE, TEX_SIZE, GL_RGBA, GL_FLOAT, NULL );
	normalBuffer -> unbind ();

	glReadPixels ( 0, 0, TEX_SIZE, TEX_SIZE, GL_RGBA, GL_FLOAT, buf );
	
	buffer.unbind          ();
}

void displayBoxes ()
{
    glMatrixMode ( GL_MODELVIEW );
    glPushMatrix ();

    glActiveTextureARB ( GL_TEXTURE1_ARB );
    glBindTexture      ( GL_TEXTURE_3D, noiseMap );

    glActiveTextureARB ( GL_TEXTURE0_ARB );

	drawCubicMappedBox ( Vector3D ( SIZE, SIZE, SIZE ), reflectionMap );

	glPopMatrix  ();
    glPushMatrix ();

    glPushClientAttrib   ( GL_CLIENT_VERTEX_ARRAY_BIT );
	
	glEnableClientState  ( GL_VERTEX_ARRAY );
	vertexBuffer -> bind ( GL_ARRAY_BUFFER_ARB );
	glVertexPointer      ( 4, GL_FLOAT, 0, NULL );
	
	glEnableClientState  ( GL_TEXTURE_COORD_ARRAY );
	normalBuffer -> bind ( GL_ARRAY_BUFFER_ARB );
	glTexCoordPointer    ( 4, GL_FLOAT, 0, NULL );
	
	indexBuffer  -> bind ( GL_ELEMENT_ARRAY_BUFFER_ARB );
	
	program.bind   ();
	glDrawElements ( GL_TRIANGLES, (TEX_SIZE-1)*(TEX_SIZE-1)*6, GL_UNSIGNED_INT, 0 );
	program.unbind ();

	glPopClientAttrib ();

    glPopMatrix ();
}

void display ()
{
	buildVertices ();

    glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

	camera.apply ();

	glMatrixMode ( GL_TEXTURE );
	glPushMatrix ();
	glRotatef    ( 90, 1, 0, 0 );

	glMatrixMode ( GL_MODELVIEW );

    displayBoxes ();

	glMatrixMode ( GL_TEXTURE );
	glPopMatrix  ();

	glMatrixMode ( GL_MODELVIEW );

    glutSwapBuffers ();
}

void reshape ( int w, int h )
{
	camera.setViewSize ( w, h, 60 );
	camera.apply       ();
}

void key ( unsigned char key, int x, int y )
{
    if ( key == 27 || key == 'q' || key == 'Q' )        
        exit ( 0 );

   	if ( key == 'w' || key == 'W' )
   		camera.moveBy ( camera.getViewDir () * 0.2 );
   	else
   	if ( key == 'x' || key == 'X' )
   		camera.moveBy ( -camera.getViewDir () * 0.2 );
   	else
   	if ( key == 'a' || key == 'A' )
   		camera.moveBy ( -camera.getSideDir () * 0.2 );
   	else
   	if ( key == 'd' || key == 'D' )
   		camera.moveBy ( camera.getSideDir () * 0.2 );
	else
	if ( key == '+' )
		amplitude += 0.02;
	else
	if ( key == '-' )
		amplitude -= 0.02;
		
	glutPostRedisplay ();
}

void    specialKey ( int key, int x, int y )
{
    if ( key == GLUT_KEY_UP )
        yaw += M_PI / 90;
    else
    if ( key == GLUT_KEY_DOWN )
        yaw -= M_PI / 90;
	else
    if ( key == GLUT_KEY_RIGHT )
        roll += M_PI / 90;
    else
    if ( key == GLUT_KEY_LEFT )
        roll -= M_PI / 90;

	camera.setEulerAngles ( yaw, pitch, roll );

    glutPostRedisplay ();
}

void	mouseFunc ( int x, int y )
{
	static	int	lastX = -1;
	static	int	lastY = -1;

	if ( lastX == -1 )				
	{
		lastX = x;
		lastY = y;
	}

	yaw  -= (y - lastY) * 0.02;
	roll += (x - lastX) * 0.02;

	lastX = x;
	lastY = y;

	camera.setEulerAngles ( yaw, pitch, roll );

	glutPostRedisplay ();
}

void    animate ()
{
	static	float	lastTime = 0.0;
	float			time     = 0.001f * glutGet ( GLUT_ELAPSED_TIME );

    lastTime = time;

    program.bind ();
    program.setUniformVector ( "eyePos",      Vector4D ( camera.getPos (), 1 ) );
    program.setUniformFloat  ( "time",        time );
    program.setUniformFloat  ( "amplitude",   amplitude );
    program.unbind ();
	
	r2vb.bind            ();
    r2vb.setUniformFloat ( "time",        time );
    r2vb.setUniformFloat ( "amplitude",   amplitude );
	r2vb.unbind          ();

    glutPostRedisplay ();
}

int main ( int argc, char * argv [] )
{
                                
    glutInit            ( &argc, argv );
    glutInitDisplayMode ( GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH );
    glutInitWindowSize  ( 512, 512 );

                              
    glutCreateWindow ( "OpenGL reflective water via R2VB vertex displacement" );

                          glutDisplayFunc       ( display    );
    glutReshapeFunc       ( reshape    );
    glutKeyboardFunc      ( key        );
    glutSpecialFunc       ( specialKey );
    glutIdleFunc          ( animate    );
    glutPassiveMotionFunc ( mouseFunc  );

    init           ();
    initExtensions ();

	assertExtensionsSupported ( "ARB_pixel_buffer_object" );

	if ( (mapFormat = fpFormatWithPrecision ( 32 ) ) == 0 )
	{
		printf ( "Floating-point textures not supported !\n" );
		
		return 1;
	}
	
	if ( !FrameBuffer :: isSupported () )
	{
		printf ( "Fbo not supported\n" );
		
		return 1;
	}
	
	if ( !GlslProgram :: isSupported () )
	{
		printf ( "GLSL not supported.\n" );

		return 1;
	}

	unsigned vertMap = buffer.createColorRectTexture ( GL_RGBA, mapFormat );
	unsigned normMap = buffer.createColorRectTexture ( GL_RGBA, mapFormat );
	
	buffer.create ();
	buffer.bind   ();
	if ( !buffer.attachColorTexture ( GL_TEXTURE_RECTANGLE_ARB, vertMap, 0 ) )
		printf ( "buffer error with color attachment 0\n");

	if ( !buffer.attachColorTexture ( GL_TEXTURE_RECTANGLE_ARB, normMap, 1 ) )
		printf ( "buffer error with color attachment 1\n");

	if ( !buffer.isOk () )
		printf ( "Error with framebuffer\n" );
					
	buffer.unbind ();
	
    if ( !program.loadShaders ( "water-2.vsh", "water-2.fsh" ) )
    {
        printf ( "Error loading shaders:\n%s\n", program.getLog ().c_str () );

        return 2;
    }

    if ( !r2vb.loadShaders ( "r2vb-1.vsh", "r2vb-1.fsh" ) )
    {
        printf ( "Error loading shaders:\n%s\n", r2vb.getLog ().c_str () );

        return 3;
    }

	const char * faces [6] =
	{
		"../../Textures/Cubemaps/skyrt.bmp",
		"../../Textures/Cubemaps/skylf.bmp",
		"../../Textures/Cubemaps/skydn.bmp",
		"../../Textures/Cubemaps/skyup.bmp",
		"../../Textures/Cubemaps/skybk.bmp",
		"../../Textures/Cubemaps/skyfr.bmp",
	};

	noiseMap      = createTexture3D ( false, "../../Textures/Noise/noise-3D.dds" );
	reflectionMap = createCubeMap   ( true, faces );

    r2vb.bind ();
	r2vb.setTexture ( "noiseMap", 0 );
    r2vb.unbind ();

    program.bind ();
    program.setTexture ( "envMap",   0 );
    program.setTexture ( "noiseMap", 1 );
    program.unbind ();

	camera.setRightHanded ( false );

	createVertexBuffer ();
	createNormalBuffer ();
	createIndexBuffer  ();

	printf ( "iiiii Ok!!" );
	
    glutMainLoop ();

    return 0;
}
Да и собссно говоря, у меня Вижл глючный(не найду никак нормального). А диплом надА делать...


Ответить с цитированием
  (#4) Непрочитано
фильтикультяплинивик
grand Master
Аватар для DeadMeat
Сообщений: 3,487
Регистрация: 28.09.2004
Адрес: Нальчик
Возраст: 36
Репутация: 33 Рейтинг
07.05.2008, 21:40

Ууу... как у тебя тут все намешано. Не люблю глут. И не юзаю.. А у тебя большая часть внутри него скрыта. Да и разве это не NV специфичное расширение? В смысле у таких под АТИ бывают проблемы. Ну и драйвера конечно.
Может выложишь тестовое ЕХЕ? Потестим.. И почему именно его юзаешь? Простое чистое FBO не проще? Просто твое расширение это OpenGL 2.0 фишка, а у старых АТИ (которые вроде как поддерживают 2.0) бывают с ними проблемы.
Вообщем хез.... выдери именно реальный код инициализации и проверь дрова.


"Mad girlfriend bug", is a bug whose immediate effect remains hidden - the app outwardly seems to function normally and tells you that everything is fine.
Ответить с цитированием
  (#5) Непрочитано
фильтикультяплинивик
grand Master
Аватар для DeadMeat
Сообщений: 3,487
Регистрация: 28.09.2004
Адрес: Нальчик
Возраст: 36
Репутация: 33 Рейтинг
07.05.2008, 21:47

Вообщем почитал еще чуток - это походу все же чисто НВшная штука. АТИ не любит ОГЛ и не реализовали толком это.. Хотя должны были.


"Mad girlfriend bug", is a bug whose immediate effect remains hidden - the app outwardly seems to function normally and tells you that everything is fine.
Ответить с цитированием
  (#6) Непрочитано
Великий
banlist
Сообщений: 1,442
Регистрация: 25.04.2007
Адрес: PRO-хладный
Возраст: 38
Репутация: 35 Рейтинг
07.05.2008, 21:50

Сори за оффтоп, но ппц что это за шняга - вершины какие-то, я как олень тот тупорогий......Нихрена не петрю...
Посетить домашнюю страницу Zaraza
Ответить с цитированием
  (#7) Непрочитано
grand Master
Аватар для Parad0
Сообщений: 4,936
Регистрация: 01.10.2006
Репутация: 222 Рейтинг
07.05.2008, 22:01

DeadMeat
У меня несколько реализаций через Pbuffer. А чем плох Glut?
Да и должна по идее Ati это все есть. Вот качаю драйвер 8.4. Там посмотрим.
И что же мне делать под Ати? С FBO дело не имел.
Да и еще: не думал, что все так упрется в железо...


Ответить с цитированием
  (#8) Непрочитано
grand Master
Аватар для Parad0
Сообщений: 4,936
Регистрация: 01.10.2006
Репутация: 222 Рейтинг
07.05.2008, 22:17

Залил к себе в папку на ФТП.
Там и скомпилированный файл.
На всякий случай туда же залил и glut.dll.


Ответить с цитированием
  (#9) Непрочитано
фильтикультяплинивик
grand Master
Аватар для DeadMeat
Сообщений: 3,487
Регистрация: 28.09.2004
Адрес: Нальчик
Возраст: 36
Репутация: 33 Рейтинг
08.05.2008, 07:54

Parad0
Чем плох? Да вот как раз тем, что лишняя DLL и плюс нету полного контроля над происходящим. Но я никому не навязываю своего мнения. Просто я привык все под контролем держать. У меня даже хедер свой, я туда прописываю только те функции, которые юзаю, тем самым я всегда знаю где и как у меня происходит инициализация и что у меня юзается.
А насчет АТИ... так она много чего должна... Но не нам. А с ФБО все в разы проще. Там 4 строчки инициализации и парочка для рисования. Вот только опять же... у АТИ с ним проблемы у старых моделей. Хотя это мог быть и драйвер, когда я тестировал.
Другой вариант - делать обычный рендер в текстуру (через контекст в битмапе) - это если планируешь сделать для старых карт. Для новых - ну в принципе и рендер в вертекс буфер тоже хорошо (правда по причине АТИ я его не юзал и не знаю его хитростей) и ФБО не плохо. А почему именно 9600 ХТ ? Отрендери на нормальной видео карте, а на дипломе покажи AVIк. А объяснишь это отсутствием поддержки на этой карте нужных фишек.

ЗЫ. Либо ГОУ на ДХ. Там все есть.


"Mad girlfriend bug", is a bug whose immediate effect remains hidden - the app outwardly seems to function normally and tells you that everything is fine.
Ответить с цитированием
  (#10) Непрочитано
grand Master
Аватар для Parad0
Сообщений: 4,936
Регистрация: 01.10.2006
Репутация: 222 Рейтинг
08.05.2008, 16:03

DeadMeat
Вот "Либо" меня не очень устраивает.
Хорошо, спасибо за совет, так и сделаю. Буду Avi-шник снимать. Если скринов будет недостаточно.
Кстати, имеется еще вопросик.
Где есть возможность взять хороший материал по системам частиц?
Да и готовые решения не помешали бы. А то моделирую частицу, задаю все вектора, а собрать из этого что-то не очень получается...


Ответить с цитированием
  (#11) Непрочитано
фильтикультяплинивик
grand Master
Аватар для DeadMeat
Сообщений: 3,487
Регистрация: 28.09.2004
Адрес: Нальчик
Возраст: 36
Репутация: 33 Рейтинг
08.05.2008, 17:00

Parad0
Нуу... системы частиц - это вообще тема такая (впрочем как и ландшафты), в которой можно мозг разминать постоянно. Там куча вариантов создания и каждый весьма неплох.
Более конкретно не могу ничего сказать, т.к. готовых решений не знаю (в смысле я их встречал и много, но так не скажу где). Могу отвечать на более конкретные вопросы. Ты определись, что именно хочешь ей изображать.
Могу посоветовать http://www.gamedev.ru
Там куча инфы. И эта... определись с окончательным железом, на котором все будет бегать. Хотя если AVIк.......


"Mad girlfriend bug", is a bug whose immediate effect remains hidden - the app outwardly seems to function normally and tells you that everything is fine.
Ответить с цитированием
  (#12) Непрочитано
grand Master
Аватар для Parad0
Сообщений: 4,936
Регистрация: 01.10.2006
Репутация: 222 Рейтинг
09.05.2008, 13:23

DeadMeat
Спасибо! Интересный ресурс.


Ответить с цитированием
  (#13) Непрочитано
grand Master
Аватар для Parad0
Сообщений: 4,936
Регистрация: 01.10.2006
Репутация: 222 Рейтинг
09.05.2008, 20:00

DeadMeat
Цитата:
И эта... определись с окончательным железом, на котором все будет бегать. Хотя если AVIк.......
В данный момент, чем располагаю, на том и запускаю...
Через FBO вроде сделал, но на АТИ как не шло, так и не идет...
На Директ уже поздновато прыгать. Диплом не за горами. Завтра на работе буду АВИ-шник делать на GeForce 8500 GT.


Ответить с цитированием
  (#14) Непрочитано
фильтикультяплинивик
grand Master
Аватар для DeadMeat
Сообщений: 3,487
Регистрация: 28.09.2004
Адрес: Нальчик
Возраст: 36
Репутация: 33 Рейтинг
09.05.2008, 20:13

Ну у тебя еще остается вариант с другим контекстом и рисованием напрямую в DC битмапа. Это должно работать уже даже на интелах.
Правда тормозить будет.

Кстати... Все никак не напишу про демку. На Gf-7300 и на x1800 XT не идет. На первом ругается на шейдер (кажется), на втором - белое окно и все.


"Mad girlfriend bug", is a bug whose immediate effect remains hidden - the app outwardly seems to function normally and tells you that everything is fine.
Ответить с цитированием
  (#15) Непрочитано
grand Master
Аватар для Parad0
Сообщений: 4,936
Регистрация: 01.10.2006
Репутация: 222 Рейтинг
09.05.2008, 20:19

DeadMeat
По идее это должно очень сильно грузить процессор. Или я ошибаюсь?


Ответить с цитированием
Ответ


Вернуться Nalchik On Line - Форум Нальчика и КБР > Hard & Soft > Soft > Developing

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Приложения для Windows Phone XaZReT Soft 18 17.08.2012 19:08
проблема ANTOTIO За рулем 19 14.01.2010 15:28
Проблема с кс 1.6 FeSS Counter-Strike 4 19.10.2007 00:22
Проблема!!! Max Hardware 12 11.12.2006 08:56
проблема 5.1 Max Hardware 6 13.08.2006 19:05