|
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, время: 07:45.
|