OpenGL communityФорумУроки по OpenGL

Урок 2 - Рисуем первый треугольник (комментарии) (4 стр)

Страницы: 1 2 3 4 5 Следующая »
#45
12:50, 3 апр 2011

Да. Во фрагментном шейдере есть in атрибут fragTexCoord. Надо попробовать, но все же непонятно, почему внутри класса такой код не работает, а без использования классов - работает.

#46
13:12, 3 апр 2011

DimaO
> Во фрагментном шейдере есть in атрибут fragTexCoord.

То что он есть ещё ничего не значит. Он реально используется? Реально влияет на выходной результат фрагментного шейдера? Если нет, то всё логично.

> без использования классов - работает.

То есть тот же самый код вне класса не даёт -1?

#47
13:42, 3 апр 2011

Код вне класса glGetAttribLocation возвращает для текстурной координаты 1. Во фрагментном шейдере стоит загрузка цвета из текстуры

#version 330 core

in vec2 fragTexCoords;

uniform sampler2D tex;

out vec4 fragColor;

void main(void)
{
  fragColor = texture(tex,fragTexCoords);
}

Это фрагментный шейдер. В принципе, fragTexCoord используется.

#48
15:17, 3 апр 2011

Ну значит где-то ты накосячил в классе.
Лог компиляции и линковки шейдеров ничего не говорит?

#49
15:34, 3 апр 2011

Лог пуст. Линковка проходит успешно. По поводу класса, вся инициализация проходит в конструкторе. Друг за другом, как в этом уроке

//Начинаем загрузку шейдеров в программу
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 имена буфера и массива атрибутов соответственно. Эта часть кода работает без проблем.

#50
20:34, 3 апр 2011

Ну я хз что сказать. Значит где-то ошибка. Попробуй внимательнее посмотреть, может где-то опечатался.

#51
9:38, 4 июля 2011

Пытаюсь настроить ортогональную матрицу проекции. И отрисовать треугольник в 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
};
#52
11:11, 4 июля 2011

goto
Ты zNear задаешь еще 0.01f а треугольник рисуешь с z = 0.0f, в матрице ортографической проекции zNear может быть и позади камеры, т.е. -1.0f например.

#53
12:13, 4 июля 2011

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, или как?

#54
14:26, 4 июля 2011

goto
> glDrawArrays( GL_QUADS
:D

Советую заглянуть в мануал - http://www.opengl.org/sdk/docs/man3/xhtml/glDrawArrays.xml

#55
14:35, 4 июля 2011

Мдя.. Глупый косяк получился) Но я подспудно это чувствовал "Квад это симулякр для immediate mode" – мои опасения подтвердились)

#56
16:26, 4 июля 2011

goto
> Мдя.. Глупый косяк получился) Но я подспудно это чувствовал "Квад это симулякр
> для immediate mode" – мои опасения подтвердились)

Ну вобщем-то если вызвать потом glGetError то он тебе скажет INVALID_ENUM, так что - проверка на ошибки наше все.

#57
20:13, 4 июля 2011

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)
#58
20:59, 4 июля 2011

goto
> 0 вернула
Давай гадать, nVidia или не forward-core контекст.

#59
22:29, 4 июля 2011

ати(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"
...
Страницы: 1 2 3 4 5 Следующая »
OpenGL communityФорумУроки по OpenGL

Тема в архиве.