 |
25.08.2012, 15:04
|
#1
|
Дэвелопер
Регистрация: 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(position, 1.0);
fragmentColor = color;
}
и пиксельный
#version 330 core
in vec3 fragmentColor;
out vec4 color;
void main(void)
{
color = vec4(fragmentColor, 1.0);
}
Собственно непонятка в этой строчке: color = vec4(fragmentColor, 1.0);
Откуда шейдер знает что именно out color это цвет текущего пикселя, который надо вывести на экран, то есть аналог gl_FragColor, как я понял
Ведь я указывал только входные данные:
// переменные для хранения индексов атрибутов
GLint positionLocation, colorLocation;
// смещения данных внутри вершинного буфера
const int vertexOffsetPosition = 0;
const int vertexOffsetColor = 3 * sizeof(float);
// получим индекс атрибута 'position' из шейдера
positionLocation = glGetAttribLocation(shaderProgram, "position");
if (positionLocation != -1)
{
// укажем параметры доступа вершинного атрибута к VBO
glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE,
vertexSize, (const GLvoid*)vertexOffsetPosition);
// разрешим использование атрибута
glEnableVertexAttribArray(positionLocation);
}
// получим индекс атрибута 'color' из шейдера
colorLocation = glGetAttribLocation(shaderProgram, "color");
if (colorLocation != -1)
{
// укажем параметры доступа вершинного атрибута к VBO
glVertexAttribPointer(colorLocation, 3, GL_FLOAT, GL_FALSE,
vertexSize, (const GLvoid*)vertexOffsetColor);
// разрешим использование атрибута
glEnableVertexAttribArray(colorLocation);
}
перед этим загнав данные меша в vbo:

// количество вершин в нашей геометрии, у нас простой треугольник
const int vertexCount = 3;
// размер одной вершины меша в байтах - 6 float на позицию и на цвет вершины
const int vertexSize = 6 * sizeof(float);
// подготовим данные для вывода треугольника, всего 3 вершины
по 6 float на каждую
static const float triangleMesh[vertexCount * 6] = {
/* 1 вершина, позиция: */ -1.0f, -1.0f, -2.0f, /* цвет: */ 1.0f, 0.0f, 0.0f,
/* 2 вершина, позиция: */ 0.0f, 1.0f, -2.0f, /* цвет: */ 0.0f, 1.0f, 0.0f,
/* 3 вершина, позиция: */ 1.0f, -1.0f, -2.0f, /* цвет: */ 0.0f, 0.0f, 1.0f
};
// переменные для хранения индексов VAO и VBO
GLuint meshVAO, meshVBO;
// создадим Vertex Array Object (VAO)
glGenVertexArrays(1, &meshVAO);
// установим созданный VAO как текущий
glBindVertexArray(meshVAO);
// создадим Vertex Buffer Object (VBO)
glGenBuffers(1, &meshVBO)
// устанавливаем созданный VBO как текущий
glBindBuffer(GL_ARRAY_BUFFER, meshVBO);
// заполним VBO данными треугольника
glBufferData(GL_ARRAY_BUFFER, vertexCount * vertexSize, triangleMesh, GL_STATIC_DRAW);
|
(Offline)
|
|
25.08.2012, 15:17
|
#2
|
|
Ответ: opengl pp непонятки
по-идее драйверу нужен 1 output к чему-то прибиндить в шейдере, а у тебя 1 аутпут как раз и есть, вот он сам по-умолчанию биндит
ps. на самом деле там индексация численная от 0 до N, потому он воспринимает 0 вывод как вывод в 0 фреймбуффер по-умолчанию пока не указано иначе
можешь написать два вывода и посмотреть как они работают
|
|
|
Сообщение было полезно следующим пользователям:
|
|
25.08.2012, 15:34
|
#3
|
Дэвелопер
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений (для 2,419 пользователей)
|
Ответ: opengl pp непонятки
все равно рисует то что надо) ладно, работает и фиг с ним)
ещё одна непонятка:
gl_FragColor мы заменили на свою переменную
но gl_Position мы не меняем ( холи в своём движке тоже не меняет)
почему?
|
(Offline)
|
|
25.08.2012, 15:40
|
#4
|
|
Ответ: 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[];
|
он нужен растеризатору (и не только), потому до сих пор это встроенная переменная
|
|
|
Сообщение было полезно следующим пользователям:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 08:54.
|