Собственные шейдеры в delphi не отрисовывают
Написал на glsl свои вертексные и фрагментные шейдеры, но не могу понять почему не работает отрисовка:
Установка начальных параметров и создание шейдеров:
FDC := GetDC(Handle);
FRC := CreateRenderingContext(FDC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
ActivateRenderingContext(FDC, FRC);
glClearColor(0, 0, 0, 0);
//======================
// Создание вершинного шейдера
vertexShader := glCreateShader(GL_VERTEX_SHADER);
vertexPtr := PChar(
'#version 120' + sLineBreak +
'attribute vec2 aPosition;' + sLineBreak +
'void main() {' + sLineBreak +
' gl_Position = vec4(aPosition, 0.0, 1.0);' + sLineBreak +
'}');
glShaderSource(vertexShader, 1, @vertexPtr, nil);
glCompileShader(vertexShader);
// Создание фрагментного шейдера
fragmentShader := glCreateShader(GL_FRAGMENT_SHADER);
vertexPtr := PChar(
'#version 120' + sLineBreak +
'void main() {' + sLineBreak +
' gl_FragColor = vec4(1.0, 0.86, 0.6, 1.0);' + sLineBreak +
'}');
glShaderSource(fragmentShader, 1, @vertexPtr, nil);
glCompileShader(fragmentShader);
//Создание программы шейдеров (предварительная сборка)
programHandle := glCreateProgram();
glAttachShader(programHandle, vertexShader);
glAttachShader(programHandle, fragmentShader);
glLinkProgram(programHandle);
glUseProgram(programHandle);
Рендер:
glGenBuffers(1, @VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, SizeOf(VertexArray), @VertexArray[0], GL_STATIC_DRAW);
aPositionIndex := glGetAttribLocation(Unit1.ProgramHandle, 'aPosition');
glEnableVertexAttribArray(aPositionIndex);
glVertexAttribPointer(aPositionIndex, 3, GL_FLOAT, false, 0, nil);///
glEnableClientState(GL_VERTEX_ARRAY);
glDrawArrays(GL_TRIANGLES, 0, 6);
//glDrawElements(GL_TRIANGLES, Length(VertexIndexes), GL_UNSIGNED_INT, VertexIndexes);
glDisableClientState(GL_VERTEX_ARRAY);
SwapBuffers(FDC);
glDeleteBuffers(1, @VBO);
Данные:
VertexArray: array[0..14] of GLfloat = (-0.5, 0.5, 0.0,
-0.5,-0.5, 0.0,
0.5,-0.5, 0.0,
0.5, 0.5, 0.0,
-0.5, 0.5, 0.0);
Источник: Stack Overflow на русском