Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > C++

Ответ
 
Опции темы
Старый 25.08.2012, 15:04   #1
den
Дэвелопер
 
Аватар для den
 
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений
(для 2,419 пользователей)
Смех opengl pp непонятки

Постигаю programmable pipeline в opengl. Делаю по туториалу. Написал программу, и к моему удивлению работает .

Есть шейдер вертексный
#version 330 core

uniform mat4 projectionMatrix;

in vec3 position;
in vec3 color;

out vec3 fragmentColor;

void main(void)
{
        
gl_Position   projectionMatrix vec4(position1.0);
        
fragmentColor color;


и пиксельный
#version 330 core

in vec3 fragmentColor;

out vec4 color;

void main(void)
{
        
color vec4(fragmentColor1.0);



Собственно непонятка в этой строчке: color = vec4(fragmentColor, 1.0);
Откуда шейдер знает что именно out color это цвет текущего пикселя, который надо вывести на экран, то есть аналог gl_FragColor, как я понял
Ведь я указывал только входные данные:


// переменные для хранения индексов атрибутов
GLint positionLocationcolorLocation;

// смещения данных внутри вершинного буфера
const int vertexOffsetPosition 0;
const 
int vertexOffsetColor    sizeof(float);


// получим индекс атрибута 'position' из шейдера
positionLocation glGetAttribLocation(shaderProgram"position");
if (
positionLocation != -1)
{
        
// укажем параметры доступа вершинного атрибута к VBO
        
glVertexAttribPointer(positionLocation3GL_FLOATGL_FALSE,
                
vertexSize, (const GLvoid*)vertexOffsetPosition);
        
// разрешим использование атрибута
        
glEnableVertexAttribArray(positionLocation);
}

// получим индекс атрибута 'color' из шейдера
colorLocation glGetAttribLocation(shaderProgram"color");
if (
colorLocation != -1)
{
        
// укажем параметры доступа вершинного атрибута к VBO
        
glVertexAttribPointer(colorLocation3GL_FLOATGL_FALSE,
                
vertexSize, (const GLvoid*)vertexOffsetColor);
        
// разрешим использование атрибута
        
glEnableVertexAttribArray(colorLocation);


перед этим загнав данные меша в vbo:
// количество вершин в нашей геометрии, у нас простой треугольник
const int vertexCount 3;

// размер одной вершины меша в байтах - 6 float на позицию и на цвет вершины
const int vertexSize sizeof(float);

// подготовим данные для вывода треугольника, всего 3 вершины
 
по 6 float на каждую
static const float triangleMesh[vertexCount 6] = {
        
/* 1 вершина, позиция: */ -1.0f, -1.0f, -2.0f/* цвет: */ 1.0f0.0f0.0f,
        
/* 2 вершина, позиция: */  0.0f,  1.0f, -2.0f/* цвет: */ 0.0f1.0f0.0f,
        
/* 3 вершина, позиция: */  1.0f, -1.0f, -2.0f/* цвет: */ 0.0f0.0f1.0f
};

// переменные для хранения индексов VAO и VBO
GLuint meshVAOmeshVBO;


// создадим Vertex Array Object (VAO)
glGenVertexArrays(1, &meshVAO);

// установим созданный VAO как текущий
glBindVertexArray(meshVAO);

// создадим Vertex Buffer Object (VBO)
glGenBuffers(1, &meshVBO)

// устанавливаем созданный VBO как текущий
glBindBuffer(GL_ARRAY_BUFFERmeshVBO);

// заполним VBO данными треугольника
glBufferData(GL_ARRAY_BUFFERvertexCount vertexSizetriangleMeshGL_STATIC_DRAW); 
(Offline)
 
Ответить с цитированием
Старый 25.08.2012, 15:17   #2
jimon
 
Сообщений: n/a
Ответ: opengl pp непонятки

по-идее драйверу нужен 1 output к чему-то прибиндить в шейдере, а у тебя 1 аутпут как раз и есть, вот он сам по-умолчанию биндит

ps. на самом деле там индексация численная от 0 до N, потому он воспринимает 0 вывод как вывод в 0 фреймбуффер по-умолчанию пока не указано иначе
можешь написать два вывода и посмотреть как они работают
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
den (25.08.2012)
Старый 25.08.2012, 15:34   #3
den
Дэвелопер
 
Аватар для den
 
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений
(для 2,419 пользователей)
Ответ: opengl pp непонятки

все равно рисует то что надо) ладно, работает и фиг с ним)

ещё одна непонятка:
gl_FragColor мы заменили на свою переменную
но gl_Position мы не меняем (холи в своём движке тоже не меняет)
почему?
(Offline)
 
Ответить с цитированием
Старый 25.08.2012, 15:40   #4
jimon
 
Сообщений: n/a
Ответ: opengl pp непонятки

http://www.opengl.org/registry/doc/G...pec.4.30.6.pdf

In the vertex language, the built-ins are intrinsically declared as:
in int gl_VertexID;
in int gl_InstanceID;
out gl_PerVertex {
vec4 gl_Position;
float gl_PointSize;
float gl_ClipDistance[];
};
In the fragment language, built-in variables are intrinsically declared as:
in vec4 gl_FragCoord;
in bool gl_FrontFacing;
in float gl_ClipDistance[];
in vec2 gl_PointCoord;
in int gl_PrimitiveID;
in int gl_SampleID;
in vec2 gl_SamplePosition;
in int gl_SampleMaskIn[];
in int gl_Layer;
in int gl_ViewportIndex;
out float gl_FragDepth;
out int gl_SampleMask[];
он нужен растеризатору (и не только), потому до сих пор это встроенная переменная
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
den (25.08.2012)
Ответ


Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 18:05.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com