Да. Во фрагментном шейдере есть in атрибут fragTexCoord. Надо попробовать, но все же непонятно, почему внутри класса такой код не работает, а без использования классов - работает.
DimaO
> Во фрагментном шейдере есть in атрибут fragTexCoord.
То что он есть ещё ничего не значит. Он реально используется? Реально влияет на выходной результат фрагментного шейдера? Если нет, то всё логично.
> без использования классов - работает.
То есть тот же самый код вне класса не даёт -1?
Код вне класса glGetAttribLocation возвращает для текстурной координаты 1. Во фрагментном шейдере стоит загрузка цвета из текстуры
#version 330 core in vec2 fragTexCoords; uniform sampler2D tex; out vec4 fragColor; void main(void) { fragColor = texture( tex,fragTexCoords); }
Это фрагментный шейдер. В принципе, fragTexCoord используется.
Ну значит где-то ты накосячил в классе.
Лог компиляции и линковки шейдеров ничего не говорит?
Лог пуст. Линковка проходит успешно. По поводу класса, вся инициализация проходит в конструкторе. Друг за другом, как в этом уроке
//Начинаем загрузку шейдеров в программу FShaderProgram := glCreateProgram; FVertexShader := glCreateShader(GL_VERTEX_SHADER); FFragmentShader := glCreateShader( GL_FRAGMENT_SHADER); //Грузим текст шейдеров LoadShaderSource( FVertexShader,'shaders/field.vs'); LoadShaderSource( FFragmentShader,'shaders/field.fs'); //Компонуем программу glAttachShader( FShaderProgram,FVertexShader); glAttachShader( FShaderProgram,FFragmentShader); LinkProgram( FShaderProgram); //Создаем VBO glGenVertexArrays( 1,@FVAO); if FVAO = 0 then begin ProgramLogFile.AddEntry( 'Can''t create VAO for map'); Exit; end; glBindVertexArray( FVAO); glGenBuffers( 1,@FVBO); if FVBO = 0 then begin ProgramLogFile.AddEntry( 'Can''t create VBO for map'); end; glBindBuffer( GL_ARRAY_BUFFER,FVBO); glBufferData( GL_ARRAY_BUFFER,SizeOf( TQuad),@FArray,GL_DYNAMIC_DRAW);
А следом идет связь атрибутов с шейдером. FVBO и FVAO имена буфера и массива атрибутов соответственно. Эта часть кода работает без проблем.
Ну я хз что сказать. Значит где-то ошибка. Попробуй внимательнее посмотреть, может где-то опечатался.
Пытаюсь настроить ортогональную матрицу проекции. И отрисовать треугольник в 2D.
Но ничего не выходит. Не пойму в чем проблема(
Ф-я настройки матрицы выглядит так…
void GLOrthographic(float *M, float left, float right, float bottom, float top, float zNear, float zFar) { const float tx = - ( right + left) / ( right - left), ty = - ( top + bottom) / ( top - bottom), tz = - ( zFar + zNear) / ( zFar - zNear); M[ 0] = 2 / ( right - left); M[ 1] = 0; M[ 2] = 0; M[ 3] = tx; M[ 4] = 0; M[ 5] = 2 / ( top - bottom); M[ 6] = 0; M[ 7] = ty; M[ 8] = 0; M[ 9] = 0; M[10] = -2 / ( zFar - zNear) ; M[11] = tz; M[12] = 0; M[13] = 0; M[14] = 0; M[15] = 1; }
Отправка в шейдер…
GLfloat OrthoProjectionMatrix[16]; GLOrthographic(OrthoProjectionMatrix, 0, 800, 600, 0, 0.01, 10.f); glUniformMatrix4fv( glGetUniformLocation( TextShader->m_ShaderProgram, "ProjectionMatrix"), 1, GL_TRUE, OrthoProjectionMatrix);
тут что GL_TRUE, что GL_FALSE – все одно.
Данные треугольника…
static const float triangleMesh[9] = { /* 1 вершина, позиция: */ 400.0f, 200.0f, 0.0f, /* 2 вершина, позиция: */ 500.0f, 300.0f, 0.0f, /* 3 вершина, позиция: */ 300.0f, 500.0f, 0.0f };
Шейдер Вершинный…
#version 330 uniform mat4 ProjectionMatrix; layout(location = 0) in vec3 position; void main( void) { gl_Position = ProjectionMatrix * vec4( position, 1.0); }
Прорисовка…
glBindVertexArray(VAO); glUseProgram( TextShader->m_ShaderProgram); SendOrthoProjectionMatrixToShader( ); glDrawArrays( GL_TRIANGLES, 0, 3 ); glBindVertexArray( 0); glUseProgram( 0);
UPD: Все кажется разобрался...
Матрица получилась такой... верхний левый угол (0,0) правый нижний (w, h)
void SetupOrthoPerspective(float *M, float w, float h, float znear, float zfar) { M[ 0] = 2/w; M[ 1] = 0; M[ 2] = 0; M[ 3] = -1; M[ 4] = 0; M[ 5] = - 2/h; M[ 6] = 0; M[ 7] = 1; M[ 8] = 0; M[ 9] = 0; M[10] = 1 / ( znear - zfar) ; M[11] = 1; M[12] = 0; M[13] = 0; M[14] = znear / ( znear - zfar); M[15] = 1; };
треугольник который рисовался
static const float triangleMesh[9] = { /* 1 вершина, позиция: */ 0.0f, 0.0f, 0.0f, /* 2 вершина, позиция: */ 0.0f, 100.0f, 0.0f, /* 3 вершина, позиция: */ 100.0f, 100.0f, 0.0f };
goto
Ты zNear задаешь еще 0.01f а треугольник рисуешь с z = 0.0f, в матрице ортографической проекции zNear может быть и позади камеры, т.е. -1.0f например.
KpeHDeJIb
> в матрице ортографической проекции zNear может быть и позади камеры, т.е. -1.0f
> например.
ценное замечание, спасибо.
теперь все работает как надо...
static const float triangleMesh[9] = { /* 1 вершина, позиция: */ 0.0f, 0.0f, 0.0f, /* 2 вершина, позиция: */ 100.0f, 0.0f, 0.0f, /* 3 вершина, позиция: */ 100.0f, 100.0f, 0.0f }; void GLOrthographic(float *M, float left, float right, float bottom, float top, float zNear, float zFar) { const float tx = - ( right + left) / ( right - left), ty = - ( top + bottom) / ( top - bottom), tz = - ( zFar + zNear) / ( zFar - zNear); M[ 0] = 2 / ( right - left); M[ 1] = 0; M[ 2] = 0; M[ 3] = tx; M[ 4] = 0; M[ 5] = 2 / ( top - bottom); M[ 6] = 0; M[ 7] = ty; M[ 8] = 0; M[ 9] = 0; M[10] = -2 / ( zFar - zNear) ; M[11] = tz; M[12] = 0; M[13] = 0; M[14] = 0; M[15] = 1; } glBindVertexArray( VAO); glUseProgram( TextShader->m_ShaderProgram); GLOrthographic( OrthoProjectionMatrix, 0, 800, 600, 0, -1.0f, 1.0f); glUniformMatrix4fv( glGetUniformLocation( TextShader->m_ShaderProgram, "ProjectionMatrix"), 1, GL_TRUE, OrthoProjectionMatrix); glDrawArrays( GL_TRIANGLES, 0, 3 ); glUseProgram( 0);
UPD: Столкнулся со следующей проблемой один GL_QUADS не рисуется( по идее все правильно и он должен был отрисоваться, что может быть?
static const float QUAD[12] = { 0.0f, 0.0f, 0.0f, 100.0f, 0.0f, 0.0f, 100.0f, 100.0f, 0.0f, 0.0f, 100.0f, 0.0f}; //инициализация vao и vbo glGenVertexArrays(1, &VAO); glBindVertexArray( VAO); glGenBuffers( 1, &VBO); glBindBuffer( GL_ARRAY_BUFFER, VBO); glBufferData( GL_ARRAY_BUFFER, sizeof( QUAD), QUAD, GL_STATIC_DRAW); positionLocation = glGetAttribLocation( TextShader->m_ShaderProgram, "position"); //glBindAttribLocation(TextShader->m_ShaderProgram, 0, "position"); glVertexAttribPointer( positionLocation, 3, GL_FLOAT, GL_FALSE, 12, 0); glEnableVertexAttribArray( positionLocation); //прорисовка... glBindVertexArray( VAO); glUseProgram( TextShader->m_ShaderProgram); SendOrthoProjectionMatrixToShader( ); //glDrawArrays( GL_TRIANGLES, 0, 3 ); glDrawArrays( GL_QUADS, 0, 4 );
два треугольника без проблем
static const float TwoTri[18] = { 0.0f, 100.0f, 0.0f, 0.0f, 0.0f, 0.0f, 100.0f, 0.0f, 0.0f, 0.0f, 100.0f, 0.0f, 100.0f, 100.0f, 0.0f, 100.0f, 0.0f, 0.0f};
а квад не выводит... почему??? Квад это симулякр только для depricated immediate mode, или как?
goto
> glDrawArrays( GL_QUADS
:D
Советую заглянуть в мануал - http://www.opengl.org/sdk/docs/man3/xhtml/glDrawArrays.xml
Мдя.. Глупый косяк получился) Но я подспудно это чувствовал "Квад это симулякр для immediate mode" – мои опасения подтвердились)
goto
> Мдя.. Глупый косяк получился) Но я подспудно это чувствовал "Квад это симулякр
> для immediate mode" – мои опасения подтвердились)
Ну вобщем-то если вызвать потом glGetError то он тебе скажет INVALID_ENUM, так что - проверка на ошибки наше все.
KpeHDeJIb
> glGetError то он тебе скажет INVALID_ENUM
а кстати, сказать проверял, непосредственно после процедуры прорисовки, 0 вернула т.е. по заверения мануала
>GL_NO_ERROR No error has been recorded. The value of this symbolic constant is guaranteed to be 0
glDrawArrays(GL_QUADS, 0, 4 ); GLenum ret = glGetError( ); //ret = GL_NO_ERROR(0)
goto
> 0 вернула
Давай гадать, nVidia или не forward-core контекст.
ати(11.6) и forward-core...
... m_hGLRenderContext = wglCreateContext(m_hDC ); if ( wglMakeCurrent( m_hDC, m_hGLRenderContext)) { PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB = NULL; int attribList[] = { WGL_CONTEXT_MAJOR_VERSION_ARB, 3, WGL_CONTEXT_MINOR_VERSION_ARB, 3, WGL_CONTEXT_FLAGS_ARB, WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB, WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_CORE_PROFILE_BIT_ARB, 0 }; wglCreateContextAttribsARB = ( PFNWGLCREATECONTEXTATTRIBSARBPROC)wglGetProcAddress( "wglCreateContextAttribsARB"); wglMakeCurrent( NULL, NULL); wglDeleteContext( m_hGLRenderContext); m_hGLRenderContext = wglCreateContextAttribsARB( m_hDC, 0, attribList); wglMakeCurrent( m_hDC, m_hGLRenderContext); InitExtensions( ); // Test GL version int nMajorVersion = -1; int nMinorVersion = -1; glGetIntegerv( GL_MAJOR_VERSION, &nMajorVersion); glGetIntegerv( GL_MINOR_VERSION, &nMinorVersion); printf( "Reported GL Version %d.%d\n", nMajorVersion, nMinorVersion); //"Reported GL Version 3.3" ...
Тема в архиве.