Лекция 6 (14.11.2013) Новая библиотека #include "glew.h“ http://glew.sourceforge.net/ Подключается перед #include "gl.h” В версии 3.0 2 вида шейдеров: Вершинный, фрагментный В версии 4.0 5 видов шейдеров: Вершинный, фрагментный, геометрический, мозаичный контрольный, мозаичный исполнительный Заголовок Секция кода Секция данных Таблица импорта Таблица экспорта (для dll) Секция ресурсов Таблица реллокаций Дополнительные секции (от упаковщиков…) вершинные шейдеры и фрагментные шейдеры Обработка вершин включает в себя операции, выполняемые над каждой вершиной, — в основном это преобразование и настройка освещения. Фрагменты — это структуры данных для каждого пиксела, которые создаются в результате растеризации графических примитивов. · Язык шейдеров OpenGL — высокоуровневый процедурный язык. · Такой же язык, с небольшими изменениями, используется для вершинных и фрагментных шейдеров. · Он базируется на синтаксисе и управлении C и С++. · Изначально в нем поддерживаются векторные и матричные операции, так как они являются неотъемлемой частью многих графических алгоритмов. · Язык более жестко проверяет типы, чем C и C++, и функции могут вызываться по возвращаемому значению. · Он использует квалификаторы типов чаще, чем управление вводом-выводом. · У него нет ни ограничений на длину шейдера, ни необходимости ее запрашивать. увеличенная реалистичность отображения материалов — металла, камня, дерева, краски и т. д.; · увеличенная реалистичность эффектов освещения — освещенных областей, мягких теней и т. д.; · изображение природных явлений — огня, дыма, воды, облаков и т. д.; · создание не фотографически точных изображений — имитация живописи, рисунка пером, воспроизведение техники иллюстрации и т. д.; · использование текстур для хранения нормалей, блеска, полиномных коэффициентов и т. д. — новые возможности использования текстурной памяти; · меньшее количество способов доступа к текстурам — текстуры могут быть созданы с помощью процедур, а не посредством доступа к текстурным картам, хранящимся в текстурной памяти; · использование новых способов обработки изображений — искривления, нечеткой обработки маски, сложного сглаживания и т. д.; · создание эффектов анимации — интерполяции ключевого кадра, процедурно определенных движений; · использование программируемых методов антиалиасинга. программируемый модуль, который выполняет операции над входными значениями вершин и другими связанными с ними данными. Вершинный процессор предназначен для выполнения следующих традиционных операций с графикой: · преобразования вершин; · преобразования нормали, нормализации; · генерирования текстурных координат; · преобразования текстурных координат; · настройки освещения; · наложения цвета материала. программируемый модуль, который выполняет операции над фрагментами и другими связанными с ними данными. Фрагментный процессор может выполнять следующие стандартные графические операции: · операции над интерполированными значениями; · доступ к текстурам; · наложение текстур; · создание эффекта дымки; · наложение цветов. #include "glew.h" #include "glut.h" #include "GL/gl.h" #include "GL/glu.h" #include "glaux.h" int main() { // Инициализация OpenGL glewInit(); // Инициализация шейдеров glutMainLoop(); } GLuint glCreateShader(GLenum type); Allocates a shader object, type must be either GL_VERTEX_SHADER or GL_FRAGMENT_SHADER. The return value is eitner a non-zero integer or zero, if an error occurred. void glShaderSource(GLuint shader, GLsizei count, const GLchar **string, const GLint * lengthy. Associates the source of a shader with a shader object shader, string is an array of count GLchar strings that compose the shader’s source. The character strings in string may be optionally nullterminated, length can be one of three values. If length is NULL, then it’s assumed that each string provided in string is null-terminated. Otherwise, length has count elements, each of which specifies the length of the corresponding entry in string. If the value of an element in the array length is a positive integer, the value represents the number of characters in the corresponding string element. If the value is negative for particular elements, then that entry in string is assumed to be null-terminated. void glCompileShader(GLuint shader); Compiles the source code for shader. The results of the compilation can be queried by calling glGetShaderiv() with an argument of GL_COMPILE_ STATUS. void glGetShaderInfoLog(GL uint shader, GLsizei bufSize, GLsizei *length, char *infoLog); Returns the log associated with the last compilation of a shader object. shader specifies which shader object to query The log is returned as a null-terminated character string of length characters in the buffer infoLog. The maximum return size of the log is specified in bufSize. If length is NULL, then no string was returned. GLuint glCreateProgram(); Allocates a shader program. void glAttachShader(GLuint program, GLuint shader); Associates the shader object, shader, with the shader program, program. A shader object can be attached to a shader program at any time, although its functionality will only be available after a successful link of the shader program. A shader object can be attached to multiple shader programs simultaneously. void glDetachShader(GLuint program, GLuint shader); Removes the association of a shader object, shader, from the shader program, program. If shader is detached from program and has been marked for deletion (by calling glDeleteShaderQ), it is deleted at that time. void glLinkProgram(GLuint program); Processes all shader objects attached to program to generate a completed shader program. The result of the linking operation can be queried by calling glGetProgramiv() with GL_LINK_STATUS. GL_TRUE is returned for a successful link; GL_FALSE is returned otherwise. As with shader objects, there’s a chance that the linking phase may fail due to errors in the attached shader objects. You can query the result of the link operation’s success by calling glGetProgramiv() with an argument of GL_ LINK_STATUS. If GL_TRUE was returned, the link was successful, and you’re able to specify the shader program for use in processing vertices or fragments. If the link failed, represented by GL_FALSE being returned, then you can determine the cause of the failure by retrieving the program link information log by calling glGetProgramLog(). void glUseProgram(GLuint program); Uses program for either vertex or fragment processing, depending upon the type of shader created with glCreateShader(). If program is zero, no shader is used for processing and OpenGL reverts to fixedfunction operation. void glDeleteShader(GLuint shader); Deletes shader. If shader is currently linked to one or more active shader programs, the object is tagged for deletion and deleted once the shader program is no longer being used by any shader piogram. void glDeleteProgram( GLuint program); Deletes program immediately if not currently in use in any context, or tagged for deletion when the program is no longer in use by any contexts. GLboolean glIsProgram(GLuint program); Returns GL_TRUE if program is the name of a shader program. If program is zero, or nonzero and not the name of a shader object, GL_FALSE is returned. GLboolean glIsShader(GLuint shader); Returns GL_TRUE if shader is the name of a shader object. If shader is zero, or non-zero and not the name of a shader object, GL_FALSF is returned. void gl Validate Program(GLuint program); Validates program against the current OpenGL state settings. After validation, the value of GL_VALIDATE_STATUS will be set to either GL_ TRUE, indicating that the program will execute in the current OpenGL environment, or GL_FALSE otherwise. The value of GL._VALIDATE_ STATUS status can be queried by calling glGetProgramiv(). vec2, vec3, vec4 - 2D, 3D and 4D floating point vector ivec2, ivec3, ivec4 - 2D, 3D and 4D integer vector bvec2, bvec3, bvec4 - 2D, 3D and 4D boolean vectors For floats here are also matrix types: mat2, mat3, mat4 - 2x2, 3x3, 4x4 floating point matrix sampler1D, sampler2D, sampler3D - 1D, 2D and 3D texture samplerCube - Cube Map texture sampler1Dshadow, sampler2Dshadow - 1D and 2D depth-component texture gl_Vertex 4D vector representing the vertex position gl_Normal 3D vector representing the vertex normal gl_Color 4D vector representing the vertex color gl_MultiTexCoordX 4D vector representing the texture coordinate of texture unit X gl_ModelViewMatrix 4x4 Matrix representing the model-view matrix. gl_ModelViewProjectionMatrix 4x4 Matrix representing the model-view-projection matrix. gl_NormalMatrix 3x3 Matrix representing the inverse transpose model-view matrix. This matrix is used for normal transformation. gl_FrontColor 4D vector representing the primitives front color gl_BackColor 4D vector representing the primitives back color gl_TexCoord[X] 4D vector representing the Xth texture coordinate gl_Position 4D vector representing the final processed vertex position. Only available in vertex shader. gl_FragColor 4D vector representing the final color which is written in the frame buffer. Only available in fragment shader. gl_FragDepth float representing the depth which is written in the depth buffer. Only available in fragment shader. void main() { gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; } void main() { } gl_FragColor = vec4(0.0, 0.5, 0.0, 1.0); uniform sampler2D my_color_texture; uniform mat4 my_texture_matrix; varying vec3 vertex_to_light_vector; varying vec3 vertex_to_eye_vector; attribute vec3 tangent; attribute vec3 binormal; GLint glGetUniformLocationARB(GLhandleARB program, const GLcharARB * name) void glUniform{1|2|3|4}{f|i}ARB(GLint location, TYPE val) void glUniform{1|2|3|4}{f|i}vARB(GLint location, GLuint count, const TYPE * vals) void glUniformMatrix{2|3|4|}fvARB(GLint location, GLuint count, GLboolean transpose, const GLfloat * vals) GLint glGetAttribLocationARB(GLhandleARB program, const GLcharARB* name) void glVertexAttrib{1|2|3|4}{s|f|d}ARB(GLuint index, TYPE val) void glVertexAttrib{1|2|3|4}{s|f|d}vARB(GLuint index, const TYPE * vals) HRSRC WINAPI FindResource( _In_opt_ HMODULE hModule, _In_ LPCTSTR lpName, _In_ LPCTSTR lpType ); Типы ресурсов: http://msdn.microsoft.com/enus/library/windows/desktop/ms648009%28v= vs.85%29.aspx HGLOBAL WINAPI LoadResource( _In_opt_ HMODULE hModule, _In_ HRSRC hResInfo ); LPVOID WINAPI LockResource( _In_ HGLOBAL hResData ); DWORD WINAPI SizeofResource( _In_opt_ HMODULE hModule, _In_ HRSRC hResInfo ); Microsoft Visual Studio Вид – Ресурсы – Щелчок правой кнопкой мыши – Добавить – Ресурс – HTML Узнать номер ресурса: Вид – Ресурсы – Щелчок правой кнопкой мыши – Символы ресурсов