Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.11.2010, 22:27   #1
.pixel
c++, dx/ogl
Форумчанин
 
Аватар для .pixel
 
Регистрация: 10.11.2008
Сообщений: 131
Вопрос GLSL

Ребят кто разбирался c шейдерными граблями GLSL?

Как с помощью GLSL вершинного шейдера организовать вывод прямоугольника в указанные координаты (x,y) как это делается с помощью glVertex2i(x,y) в glOrtho - режиме. т.е. чтобы координатная система была не -1…1 по xy-осям, а соизмерима с шириной и высотой текущего окна и измерялась в пикселях;

Пользуясь примерами из сети на геймдеве и других сайтах, на их основе собрал свою солянку. Нарисовал прямоугольник + 2 шейдера к нему (меняются по нажатию клавиш 1 и 2)

…но все-таки он рисуется в 3d мире… а как привязать его к координатам окна пока не догадался.
Есть идеи?)
А может быть готовые решения или примеры?. Я пока сам не нашел таких(
Вложения
Тип файла: rar opengl3.2_render_2d_rectangle.rar (30.1 Кб, 19 просмотров)
“Batch, Batch, Batch:” What Does It Really Mean?
I am a donut! Ask not how many tris/batch, but
rather how many batches/frame!
.pixel вне форума Ответить с цитированием
Старый 13.11.2010, 13:57   #2
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

Не совсем понял в чем проблема. Тебе нужно в вершинном шейдере изменить положение рисуемого в opengl объекта, при этом указывая реальные координаты а не -1..1?
Вадим Буренков вне форума Ответить с цитированием
Старый 13.11.2010, 20:41   #3
.pixel
c++, dx/ogl
Форумчанин
 
Аватар для .pixel
 
Регистрация: 10.11.2008
Сообщений: 131
По умолчанию

Именно)
Я так предполагаю, что работа в этом случае производится с матрицей проекции (projectionMatrix)

Мне интересно.
Как ее просчитывают?
И где ее просчитывают? (в программе с помощью ЦПУ или же отправляют в виде юниформов (glUniform…) в шейдер и там считают?)
“Batch, Batch, Batch:” What Does It Really Mean?
I am a donut! Ask not how many tris/batch, but
rather how many batches/frame!
.pixel вне форума Ответить с цитированием
Старый 13.11.2010, 22:11   #4
Develop
Пользователь
 
Регистрация: 26.06.2010
Сообщений: 52
По умолчанию

Вместо glOrtho(...) используй gluOrtho2D(0.0,Width,0.0,Height);
где Width и Height - ширина и высота окна в пикселях.
Тогда в glVertex(...) координаты X и Y можна задавать в пикселях.

Но ИМХО это очень неудобно ибо ты жестко привязываешься к размерам окна.
Develop вне форума Ответить с цитированием
Старый 13.11.2010, 23:40   #5
.pixel
c++, dx/ogl
Форумчанин
 
Аватар для .pixel
 
Регистрация: 10.11.2008
Сообщений: 131
По умолчанию

Спасибо, знаю про gluOrtho2D, но нет это не то(.

Используется gl3+ контекст и хотелось бы использовать его парадигму программирования графики. А это в основе своей работа и рисование только через шейдеры, с загрузкой буферов и текстур в видео, а тут на стороне ЦПУ нам рекомендуется лишь только опрашивать и задавать «стейты устройства рендеринга» посредством glEnable(), в общем прослеживается следующая логика - кормить видео карту данными и программами -шейдерами и следить за выполнением)

Immediate mode – отбрасывается, это glVertex() и иже с ней старый функционал.

И потом glOrtho / gluOrtho2D все равно манипулировала матрицей, которую я и сам могу передать видео карте для просчета геометрии.


Глянул dxsdk документацию нашел там описание ф-и D3DXMatrixOrthoRH

This function uses the following formula to compute the returned matrix.


Где…

w [in] Width of the view volume.
h [in] Height of the view volume.
zn [in] Minimum z-value of the view volume.
zf [in] Maximum z-value of the view volume.

Это уже ближе к сути моего вопроса))
“Batch, Batch, Batch:” What Does It Really Mean?
I am a donut! Ask not how many tris/batch, but
rather how many batches/frame!
.pixel вне форума Ответить с цитированием
Старый 14.11.2010, 00:33   #6
.pixel
c++, dx/ogl
Форумчанин
 
Аватар для .pixel
 
Регистрация: 10.11.2008
Сообщений: 131
По умолчанию

Кажется, разобрался ф-я получилась такой…
Код:
void Matrix4Ortho(float *M, float w, float h, float znear, float zfar)
{
	float A = (1/ (znear - zfar));
	float B = znear / (znear - zfar);

	M[ 0] = 2 / w;	M[ 1] =  0;	M[ 2] =  0;	M[ 3] =  0;
	M[ 4] = 0;	M[ 5] =  2 / h;	M[ 6] =  0;	M[ 7] =  0;
	M[ 8] = 0;	M[ 9] =  0;	M[10] = A;	M[11] =  0; 
	M[12] = 0;	M[13] =  0;	M[14] = 0;	M[15] =  1;
}
Задаю параметры текущего окна для праворукой орто-матрицы…
Код:
Matrix4Ortho(OrthoMatrix, 800, 600, 1, -1);
Скармливаю матрицу вершинному шейдеру
Код:
// получим индекс юниформа OrthoMatrix из шейдерной программе
GLint OrthoMatrixLocation = glGetUniformLocation(shaderProgram, "OrthoMatrix ");
	// передадим матрицу в шейдер
	if (OrthoMatrixLocation != -1)
		glUniformMatrix4fv(OrthoMatrixLocation, 1, GL_TRUE, OrthoMatrix);
Далее рисую данную геометрию…
Код:
	const float rect_width = 200.0f;
	
	static const float rectMesh[vertexCount * 6] = {
		/* 1 вершина, позиция: */ -rect_width, -rect_width, 0.0f, /* цвет: */ 1.0f, 0.0f, 0.0f,
		/* 2 вершина, позиция: */ -rect_width,  rect_width, 0.0f, /* цвет: */ 0.0f, 1.0f, 0.0f,
		/* 3 вершина, позиция: */  rect_width, -rect_width, 0.0f, /* цвет: */ 0.0f, 0.0f, 1.0f,
		/* 4 вершина, позиция: */  rect_width,  rect_width, 0.0f, /* цвет: */ 1.0f, 1.0f, 1.0f,
	};
	static const float rectTexCoord[vertexCount * 2] = {
		/* 1 вершина, позиция: */ 0.0f, 0.0f,
		/* 2 вершина, позиция: */ 0.0f,  1.0f,
		/* 3 вершина, позиция: */  1.0f, 0.0f,
		/* 4 вершина, позиция: */  1.0f,  1.0f,
	};
Сам вершинный шейдер...
Код:
#version 150

uniform mat4 OrthoMatrix;

// входящие вершинные атрибуты
in vec3 position;
in vec2 texcoord;

// исходящие параметры, которые будут переданы в фрагментный шейдер
out vec2 fragTexcoord;

void main(void)
{
	// перевод позиции вершины из локальных координат в однородные
	gl_Position = OrthoMatrix * vec4(position, 1.0);

	// передадим текстурные координаты в фрагментный шейдер
	fragTexcoord = texcoord;
}
Результат!))



Для полного счастья осталось реализовать еще два момента.
1. реализовать мат. модель ф-ии D3DXMatrixOrthoOffCenterRH дабы (0,0) находится не по центру, а в углу окна.
2. и возможность задавать координаты и размеры прямоугольника через юниформы шейдера. чтобы каждый раз не пересобрать геометрию, в случае изменения положения или линейных размеров прямоугольника)
“Batch, Batch, Batch:” What Does It Really Mean?
I am a donut! Ask not how many tris/batch, but
rather how many batches/frame!

Последний раз редактировалось Beermonza; 15.11.2010 в 20:45.
.pixel вне форума Ответить с цитированием
Старый 15.11.2010, 14:51   #7
.pixel
c++, dx/ogl
Форумчанин
 
Аватар для .pixel
 
Регистрация: 10.11.2008
Сообщений: 131
По умолчанию

Что значит - «forward compatible»?
Тут, наверное, надо иметь ввиду создаваемый контекст GL все-таки.
Я так понимаю всего их два типа может быть (возможно и смешанный тип?).
1. WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ ARB
И
2. WGL_CONTEXT_CORE_PROFILE_BIT_ARB

Собственно вопрос: какая практическая польза от этих флагов, и как они сказываются на производительности (если сказываются) или на функциональности, контекста?

Пример:
Код:
int attribListGL32[] =
{
WGL_CONTEXT_MAJOR_VERSION_ARB, 3,
WGL_CONTEXT_MINOR_VERSION_ARB, 2,
WGL_CONTEXT_FLAGS_ARB, WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB,
WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_CORE_PROFILE_BIT_ARB,
0
};

if (!(m_hRC = wglCreateContextAttribsARB(m_hDC, 0, attribListGL32)))
throw std::runtime_error("wglCreateContextAttribsARB() failed for OpenGL 3 context.");
Впрочем, контекст прекрасно создается и без двух последних флагов.

Код:
int attribListGL32[] =
{
WGL_CONTEXT_MAJOR_VERSION_ARB, 3,
WGL_CONTEXT_MINOR_VERSION_ARB, 2,
WGL_CONTEXT_FLAGS_ARB, WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB,
0
};

Извиняюсь, данное сообщение больше не актуально, нашел ответ)
Цитата:
// укажем атрибуты для создания расширенного контекста OpenGL 3.3
// атрибуты установлены согласно спецификации расширения:

// WGL_CONTEXT_MAJOR_VERSION_ARB - старшая цифра необходимой версии

// WGL_CONTEXT_MINOR_VERSION_ARB - младшая цифра необходимой версии

// WGL_CONTEXT_FLAGS_ARB - флаги контекста, для нас это контекст с поддержкой
// нового функционала WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ ARB

// WGL_CONTEXT_PROFILE_MASK_ARB - профиль создаваемого контекста, выбираем
// WGL_CONTEXT_CORE_PROFILE_BIT_ARB, все устройства с OpenGL 3.2 и старше
// должны поддерживать профиль CORE, этот профиль позволяет получить доступ
// к новому функционалу и говорит об отказе от устаревшего функционала
“Batch, Batch, Batch:” What Does It Really Mean?
I am a donut! Ask not how many tris/batch, but
rather how many batches/frame!

Последний раз редактировалось .pixel; 15.11.2010 в 15:19. Причина: время
.pixel вне форума Ответить с цитированием
Старый 08.12.2010, 18:01   #8
.pixel
c++, dx/ogl
Форумчанин
 
Аватар для .pixel
 
Регистрация: 10.11.2008
Сообщений: 131
По умолчанию

Случаем никто не озадачивался генерированием Индексного буфера для Вершинной геометрии? Может, есть у кого чего по этому поводу?

Надоело для своих поделок делать так…

Код:
const GLshort VertexData[] =
{
		//Вершины , цвета, координаты текстуры и другая инфа…
};

const GLshort indexData[] =
{
		//Индексы , много индексов…
};
Хотелось бы IB получать так…

Код:
generate_ib_from_vb ( some_flags_if_needed, &VertexData[0], &indexData );
“Batch, Batch, Batch:” What Does It Really Mean?
I am a donut! Ask not how many tris/batch, but
rather how many batches/frame!
.pixel вне форума Ответить с цитированием
Старый 16.12.2010, 22:25   #9
.pixel
c++, dx/ogl
Форумчанин
 
Аватар для .pixel
 
Регистрация: 10.11.2008
Сообщений: 131
По умолчанию

Пытаюсь масштабировать текстуру на плоскости и вот что выходит Оо


Геометрия плоскости. (в VBO)
Код:
float PlaneVertexes[32]= {
	//positions/color/uv
	-0.5f, -0.5f, 0.0f, /*цвет*/ 0.5f, 0.5f, 0.5f, /*uv*/0.0f, 0.0f,
	-0.5f, 0.5f, 0.0f, /*цвет*/ 0.0f, 1.0f, 0.0f,/*uv*/ 2.0f, 0.0f,
	0.5f, 0.5f, 0.0f,/*цвет*/ 0.0f,  0.0f, 0.0f,/*uv*/ 2.0f, 2.0f,
	0.5f, -0.5f, 0.0f,/*цвет*/ 1.0f, 1.0f, 1.0f,/*uv*/ 2.0f, 0.0f};
Из UV координат, видно что на плоскости должны быть, по крайней мере четыре фрагмента текстуры. А накладывается только один( В чем может быть проблема и где тут может быть зарыта грабля?

Вершинный шейдер только передает текстурные координаты во фрагментный шейдер.

Фрагментный шейдер.
Код:
#version 330 core

// текстура
uniform sampler2D colorTexture;

// текстурные координаты
in vec2 fragTexcoord;
// интерп. цвет вершины
smooth in vec3 theColor;

// результирующий цвет пикселя на экране
out vec4 color;

void main(void)
{
	// получим цвет пикселя из текстуры по текстурным координатам
	color = texture(colorTexture, fragTexcoord);
}
Вложения
Тип файла: rar GLApp.rar (212.8 Кб, 12 просмотров)
“Batch, Batch, Batch:” What Does It Really Mean?
I am a donut! Ask not how many tris/batch, but
rather how many batches/frame!
.pixel вне форума Ответить с цитированием
Старый 18.12.2010, 14:30   #10
.pixel
c++, dx/ogl
Форумчанин
 
Аватар для .pixel
 
Регистрация: 10.11.2008
Сообщений: 131
По умолчанию

Разобрался с текстурой… грабля как оказалось, была в процедуре загрузки текстуры… надо было сменить способ обертки текстуры с GL_CLAMP_TO_EDGE на GL_REPEAT:
Код:
...
// установим параметры "оборачиваниея" текстуры - отсутствие оборачивания
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
...
Код:
...
// есть оборачивание
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
...
Теперь новая «веха» в разработке – загрузка моделей в сцену. Написал парсер-загрузчик obj-моделей. Ну а модельку слепил в Blender’e.

«Деревянный космолет с кучей гвоздей» - ну или нечто на него отдаленно похожее))


* в дальнейшем хочу разобраться с
- текстурной разверткой
- а так же сделать простеющую Tweening- вершинную анимацию. (Наподобие DolphinVS из DX9SDK, где вся анимация движения дельфина строится на основе интерполированных данных из вершин трех сеток(Mesh’й) (читай - 3-х кадров анимации))
Вложения
Тип файла: rar gl3App.rar (221.9 Кб, 14 просмотров)
“Batch, Batch, Batch:” What Does It Really Mean?
I am a donut! Ask not how many tris/batch, but
rather how many batches/frame!

Последний раз редактировалось .pixel; 18.12.2010 в 14:49. Причина: время
.pixel вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск