Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

We’re showing branches in this repository, but you can also compare across forks.

...
  • 5 commits
  • 13 files changed
  • 0 commit comments
  • 1 contributor
Commits on Aug 14, 2011
Christophe Riccio Added glMapBufferRange 9b7578c
Christophe Riccio Merge branch '4.2.0' of ssh://g-truc.git.sourceforge.net/gitroot/ogl-…
…samples/ogl-samples into 4.2.0
482e062
Christophe Riccio Fixed CMake project 13d94ed
Christophe Riccio More pipeline objects d02cf49
Christophe Riccio updated ogl-420-image-unpack 77f7f5e
3  CMakeLists.txt
View
@@ -28,9 +28,6 @@ endmacro(addExternalPackageGTC)
find_package(OpenGL)
find_package(GLUT)
-if(MSVC)
- find_package(GLEW)
-endif(MSVC)
if(NOT OPENGL_FOUND)
message("ERROR: OpenGL not found")
endif(NOT OPENGL_FOUND)
9 data/420/atomic-counter.vert
View
@@ -5,7 +5,12 @@
#define TEXCOORD 4
#define FRAG_COLOR 0
-uniform mat4 MVP;
+#define TRANSFORM0 1
+
+layout(binding = TRANSFORM0) uniform transform
+{
+ mat4 MVP;
+} Transform;
layout(location = POSITION) in vec2 Position;
layout(location = TEXCOORD) in vec2 Texcoord;
@@ -23,5 +28,5 @@ out gl_PerVertex
void main()
{
Out.Texcoord = Texcoord;
- gl_Position = MVP * vec4(Position, float(gl_InstanceID) * 0.25 - 0.5, 1.0);
+ gl_Position = Transform.MVP * vec4(Position, float(gl_InstanceID) * 0.25 - 0.5, 1.0);
}
3  data/420/test-depth-conservative.frag
View
@@ -2,9 +2,6 @@
#define FRAG_COLOR 0
-precision highp float;
-precision highp int;
-
uniform vec4 Diffuse;
in block
3  data/420/test-depth-conservative.vert
View
@@ -2,9 +2,6 @@
#define POSITION 0
-precision highp float;
-precision highp int;
-
uniform mat4 MVP;
layout(location = POSITION) in vec2 Position;
5 data/420/transform-stream.geom
View
@@ -22,6 +22,11 @@ out block
layout(stream = 0) vec4 Color;
} Out;
+out gl_PerVertex
+{
+ vec4 gl_Position;
+} gl_Out;
+
void main()
{
for(int i = 0; i < gl_in.length(); ++i)
8 samples/CMakeLists.txt
View
@@ -213,6 +213,10 @@ set(GL_SHADER_GTC draw-base-instance.vert draw-base-instance.frag)
glCreateSampleGTC(draw-base-instance)
set(GL_SHADER_GTC matching-array.vert matching-array.cont matching-array.eval matching-array.geom matching-array.frag)
glCreateSampleGTC(glsl-interface-matching-array-gtc)
+set(GL_SHADER_GTC image-load.vert image-load.frag)
+glCreateSampleGTC(image-load)
+set(GL_SHADER_GTC image-unpack.vert image-unpack.frag)
+glCreateSampleGTC(image-unpack)
set(GL_SHADER_GTC memory-barrier.vert memory-barrier.frag texture-2d.vert texture-2d.frag)
glCreateSampleGTC(memory-barrier)
set(GL_SHADER_GTC test-depth-conservative.vert test-depth-conservative.frag)
@@ -223,9 +227,5 @@ set(GL_SHADER_GTC texture-2d.vert texture-2d.frag)
glCreateSampleGTC(texture-2d-storage)
set(GL_SHADER_GTC texture-2d.vert texture-2d.frag)
glCreateSampleGTC(texture-compressed)
-set(GL_SHADER_GTC image-load.vert image-load.frag)
-glCreateSampleGTC(image-load)
-set(GL_SHADER_GTC image-unpack.vert image-unpack.frag)
-glCreateSampleGTC(image-unpack)
set(GL_SHADER_GTC feedback-stream.vert feedback-stream.frag transform-stream.vert transform-stream.geom)
glCreateSampleGTC(transform-feedback-instanced)
53 samples/ogl-420-atomic-counter.cpp
View
@@ -187,6 +187,18 @@ bool initAtomicCounter()
return Validated;
}
+bool initUniformBuffer()
+{
+ bool Validated(true);
+
+ glGenBuffers(1, &BufferName[buffer::TRANSFORM]);
+ glBindBuffer(GL_UNIFORM_BUFFER, BufferName[buffer::TRANSFORM]);
+ glBufferData(GL_UNIFORM_BUFFER, sizeof(glm::mat4), 0, GL_DYNAMIC_DRAW);
+ glBindBuffer(GL_UNIFORM_BUFFER, 0);
+
+ return Validated;
+}
+
bool initDebugOutput()
{
bool Validated(true);
@@ -215,6 +227,8 @@ bool begin()
Validated = initArrayBuffer();
if(Validated)
Validated = initVertexArray();
+ if(Validated)
+ Validated = initUniformBuffer();
return Validated;
}
@@ -239,18 +253,32 @@ void display()
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// Compute the MVP (Model View Projection matrix)
- glm::mat4 Projection = glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.0f);
- glm::mat4 ViewTranslate = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -Window.TranlationCurrent.y));
- glm::mat4 ViewRotateX = glm::rotate(ViewTranslate, Window.RotationCurrent.y, glm::vec3(1.f, 0.f, 0.f));
- glm::mat4 View = glm::rotate(ViewRotateX, Window.RotationCurrent.x, glm::vec3(0.f, 1.f, 0.f));
- glm::mat4 Model = glm::mat4(1.0f);
- glm::mat4 MVP = Projection * View * Model;
+ {
+ glBindBuffer(GL_UNIFORM_BUFFER, BufferName[buffer::TRANSFORM]);
- glProgramUniformMatrix4fv(ProgramName, UniformMVP, 1, GL_FALSE, &MVP[0][0]);
+ glm::mat4* Pointer = (glm::mat4*)glMapBufferRange(
+ GL_UNIFORM_BUFFER, 0, sizeof(glm::mat4),
+ GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT | GL_MAP_UNSYNCHRONIZED_BIT);
- GLuint InitialValue = 0;
- glBindBuffer(GL_ATOMIC_COUNTER_BUFFER, AtomicCounter);
- glBufferSubData(GL_ATOMIC_COUNTER_BUFFER, 0, sizeof(GLuint), &InitialValue);
+ glm::mat4 Projection = glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.0f);
+ glm::mat4 ViewTranslate = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -Window.TranlationCurrent.y));
+ glm::mat4 ViewRotateX = glm::rotate(ViewTranslate, Window.RotationCurrent.y, glm::vec3(1.f, 0.f, 0.f));
+ glm::mat4 View = glm::rotate(ViewRotateX, Window.RotationCurrent.x, glm::vec3(0.f, 1.f, 0.f));
+ glm::mat4 Model = glm::mat4(1.0f);
+ glm::mat4 MVP = Projection * View * Model;
+
+ *Pointer = MVP;
+ }
+
+ {
+ glBindBuffer(GL_ATOMIC_COUNTER_BUFFER, AtomicCounter);
+
+ glm::uint32* Pointer = (glm::uint32*)glMapBufferRange(
+ GL_UNIFORM_BUFFER, 0, sizeof(glm::uint32),
+ GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT | GL_MAP_UNSYNCHRONIZED_BIT);
+
+ *Pointer = 0;
+ }
glViewportIndexedf(0, 0, 0, float(Window.Size.x), float(Window.Size.y));
glClearBufferfv(GL_COLOR, 0, &glm::vec4(0.0f, 0.0f, 0.0f, 1.0f)[0]);
@@ -261,6 +289,11 @@ void display()
glBindVertexArray(VertexArrayName);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, BufferName[buffer::ELEMENT]);
glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER, 0, AtomicCounter);
+ glBindBufferBase(GL_UNIFORM_BUFFER, glf::semantic::uniform::TRANSFORM0, BufferName[buffer::TRANSFORM]);
+
+ // Make sure the uniform buffer is uploaded
+ glUnmapBuffer(GL_UNIFORM_BUFFER);
+ glUnmapBuffer(GL_ATOMIC_COUNTER_BUFFER);
glDrawElementsInstancedBaseVertexBaseInstance(
GL_TRIANGLES, ElementCount, GL_UNSIGNED_SHORT, 0, 5, 0, 0);
45 samples/ogl-420-image-load.cpp
View
@@ -154,6 +154,8 @@ bool initTexture2D()
{
bool Validated(true);
+ gli::texture2D Texture = gli::load(TEXTURE_DIFFUSE);
+
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glGenTextures(1, &TextureName);
@@ -162,19 +164,17 @@ bool initTexture2D()
glBindTexture(GL_TEXTURE_2D, TextureName);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexStorage2D(GL_TEXTURE_2D, GLint(Texture.levels()), GL_RGBA8, GLsizei(Texture[0].dimensions().x), GLsizei(Texture[0].dimensions().y));
- gli::texture2D Texture = gli::load(TEXTURE_DIFFUSE);
for(std::size_t Level = 0; Level < Texture.levels(); ++Level)
{
- glTexImage2D(
+ glTexSubImage2D(
GL_TEXTURE_2D,
GLint(Level),
- GL_RGBA8,
+ 0, 0,
GLsizei(Texture[Level].dimensions().x),
GLsizei(Texture[Level].dimensions().y),
- 0,
- GL_BGRA,
- GL_UNSIGNED_BYTE,
+ GL_BGRA, GL_UNSIGNED_BYTE,
Texture[Level].data());
}
ImageSize = glm::uvec2(Texture[0].dimensions());
@@ -280,29 +280,34 @@ bool end()
void display()
{
- glm::mat4 Projection = glm::perspective(45.0f, float(Window.Size.x) / Window.Size.y, 0.1f, 1000.0f);
- glm::mat4 ViewTranslate = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -Window.TranlationCurrent.y));
- glm::mat4 ViewRotateX = glm::rotate(ViewTranslate, Window.RotationCurrent.y, glm::vec3(1.f, 0.f, 0.f));
- glm::mat4 View = glm::rotate(ViewRotateX, Window.RotationCurrent.x, glm::vec3(0.f, 1.f, 0.f));
- glm::mat4 Model = glm::mat4(1.0f);
- glm::mat4 MVP = Projection * View * Model;
-
- glBindBuffer(GL_UNIFORM_BUFFER, BufferName[buffer::TRANSFORM]);
- glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(MVP), &MVP[0][0]);
+ {
+ glm::mat4 Projection = glm::perspective(45.0f, float(Window.Size.x) / Window.Size.y, 0.1f, 1000.0f);
+ glm::mat4 ViewTranslate = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -Window.TranlationCurrent.y));
+ glm::mat4 ViewRotateX = glm::rotate(ViewTranslate, Window.RotationCurrent.y, glm::vec3(1.f, 0.f, 0.f));
+ glm::mat4 View = glm::rotate(ViewRotateX, Window.RotationCurrent.x, glm::vec3(0.f, 1.f, 0.f));
+ glm::mat4 Model = glm::mat4(1.0f);
+ glm::mat4 MVP = Projection * View * Model;
- glBindBuffer(GL_UNIFORM_BUFFER, BufferName[buffer::MATERIAL]);
- glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(ImageSize), &ImageSize[0]);
+ glBindBuffer(GL_UNIFORM_BUFFER, BufferName[buffer::TRANSFORM]);
+ glm::mat4* Pointer = (glm::mat4*)glMapBufferRange(GL_UNIFORM_BUFFER, 0, sizeof(MVP), GL_MAP_WRITE_BIT);
+ *Pointer = MVP;
+ glUnmapBuffer(GL_UNIFORM_BUFFER);
+ }
+
+ {
+ glBindBuffer(GL_UNIFORM_BUFFER, BufferName[buffer::MATERIAL]);
+ glm::uvec2* Pointer = (glm::uvec2*)glMapBufferRange(GL_UNIFORM_BUFFER, 0, sizeof(glm::uvec2), GL_MAP_WRITE_BIT);
+ *Pointer = ImageSize;
+ glUnmapBuffer(GL_UNIFORM_BUFFER);
+ }
glViewportIndexedf(0, 0, 0, float(Window.Size.x), float(Window.Size.y));
glClearBufferfv(GL_COLOR, 0, &glm::vec4(1.0f, 0.5f, 0.0f, 1.0f)[0]);
glBindBufferBase(GL_UNIFORM_BUFFER, glf::semantic::uniform::TRANSFORM0, BufferName[buffer::TRANSFORM]);
glBindBufferBase(GL_UNIFORM_BUFFER, glf::semantic::uniform::MATERIAL, BufferName[buffer::MATERIAL]);
-
glBindProgramPipeline(PipelineName);
-
glBindImageTexture(glf::semantic::image::DIFFUSE, TextureName, 0, GL_FALSE, 0, GL_READ_ONLY, GL_RGBA8);
-
glBindVertexArray(VertexArrayName);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, BufferName[buffer::ELEMENT]);
45 samples/ogl-420-image-unpack.cpp
View
@@ -154,6 +154,8 @@ bool initTexture2D()
{
bool Validated(true);
+ gli::texture2D Texture = gli::load(TEXTURE_DIFFUSE);
+
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glGenTextures(1, &TextureName);
@@ -162,19 +164,17 @@ bool initTexture2D()
glBindTexture(GL_TEXTURE_2D, TextureName);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexStorage2D(GL_TEXTURE_2D, GLint(Texture.levels()), GL_RGBA8, GLsizei(Texture[0].dimensions().x), GLsizei(Texture[0].dimensions().y));
- gli::texture2D Texture = gli::load(TEXTURE_DIFFUSE);
for(std::size_t Level = 0; Level < Texture.levels(); ++Level)
{
- glTexImage2D(
+ glTexSubImage2D(
GL_TEXTURE_2D,
GLint(Level),
- GL_RGBA8,
+ 0, 0,
GLsizei(Texture[Level].dimensions().x),
GLsizei(Texture[Level].dimensions().y),
- 0,
- GL_BGRA,
- GL_UNSIGNED_BYTE,
+ GL_BGRA, GL_UNSIGNED_BYTE,
Texture[Level].data());
}
ImageSize = glm::uvec2(Texture[0].dimensions());
@@ -280,29 +280,34 @@ bool end()
void display()
{
- glm::mat4 Projection = glm::perspective(45.0f, float(Window.Size.x) / Window.Size.y, 0.1f, 1000.0f);
- glm::mat4 ViewTranslate = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -Window.TranlationCurrent.y));
- glm::mat4 ViewRotateX = glm::rotate(ViewTranslate, Window.RotationCurrent.y, glm::vec3(1.f, 0.f, 0.f));
- glm::mat4 View = glm::rotate(ViewRotateX, Window.RotationCurrent.x, glm::vec3(0.f, 1.f, 0.f));
- glm::mat4 Model = glm::mat4(1.0f);
- glm::mat4 MVP = Projection * View * Model;
-
- glBindBuffer(GL_UNIFORM_BUFFER, BufferName[buffer::TRANSFORM]);
- glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(MVP), &MVP[0][0]);
+ {
+ glm::mat4 Projection = glm::perspective(45.0f, float(Window.Size.x) / Window.Size.y, 0.1f, 1000.0f);
+ glm::mat4 ViewTranslate = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -Window.TranlationCurrent.y));
+ glm::mat4 ViewRotateX = glm::rotate(ViewTranslate, Window.RotationCurrent.y, glm::vec3(1.f, 0.f, 0.f));
+ glm::mat4 View = glm::rotate(ViewRotateX, Window.RotationCurrent.x, glm::vec3(0.f, 1.f, 0.f));
+ glm::mat4 Model = glm::mat4(1.0f);
+ glm::mat4 MVP = Projection * View * Model;
- glBindBuffer(GL_UNIFORM_BUFFER, BufferName[buffer::MATERIAL]);
- glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(ImageSize), &ImageSize[0]);
+ glBindBuffer(GL_UNIFORM_BUFFER, BufferName[buffer::TRANSFORM]);
+ glm::mat4* Pointer = (glm::mat4*)glMapBufferRange(GL_UNIFORM_BUFFER, 0, sizeof(MVP), GL_MAP_WRITE_BIT);
+ *Pointer = MVP;
+ glUnmapBuffer(GL_UNIFORM_BUFFER);
+ }
+
+ {
+ glBindBuffer(GL_UNIFORM_BUFFER, BufferName[buffer::MATERIAL]);
+ glm::uvec2* Pointer = (glm::uvec2*)glMapBufferRange(GL_UNIFORM_BUFFER, 0, sizeof(glm::uvec2), GL_MAP_WRITE_BIT);
+ *Pointer = ImageSize;
+ glUnmapBuffer(GL_UNIFORM_BUFFER);
+ }
glViewportIndexedf(0, 0, 0, float(Window.Size.x), float(Window.Size.y));
glClearBufferfv(GL_COLOR, 0, &glm::vec4(1.0f, 0.5f, 0.0f, 1.0f)[0]);
glBindBufferBase(GL_UNIFORM_BUFFER, glf::semantic::uniform::TRANSFORM0, BufferName[buffer::TRANSFORM]);
glBindBufferBase(GL_UNIFORM_BUFFER, glf::semantic::uniform::MATERIAL, BufferName[buffer::MATERIAL]);
-
glBindProgramPipeline(PipelineName);
-
glBindImageTexture(glf::semantic::image::DIFFUSE, TextureName, 0, GL_FALSE, 0, GL_READ_ONLY, GL_RGBA8);
-
glBindVertexArray(VertexArrayName);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, BufferName[buffer::ELEMENT]);
16 samples/ogl-420-test-depth-conservative.cpp
View
@@ -17,8 +17,8 @@
namespace
{
std::string const SAMPLE_NAME = "Test Depth Conservative";
- std::string const VERTEX_SHADER_SOURCE(glf::DATA_DIRECTORY + "420/test-depth-conservative.vert");
- std::string const FRAGMENT_SHADER_SOURCE(glf::DATA_DIRECTORY + "420/test-depth-conservative.frag");
+ std::string const VERT_SHADER_SOURCE(glf::DATA_DIRECTORY + "420/test-depth-conservative.vert");
+ std::string const FRAG_SHADER_SOURCE(glf::DATA_DIRECTORY + "420/test-depth-conservative.frag");
int const SAMPLE_SIZE_WIDTH(640);
int const SAMPLE_SIZE_HEIGHT(480);
int const SAMPLE_MAJOR_VERSION(4);
@@ -61,14 +61,14 @@ bool initProgram()
// Create program
if(Validated)
{
- GLuint VertexShaderName = glf::createShader(GL_VERTEX_SHADER, VERTEX_SHADER_SOURCE);
- GLuint FragmentShaderName = glf::createShader(GL_FRAGMENT_SHADER, FRAGMENT_SHADER_SOURCE);
+ GLuint VertShaderName = glf::createShader(GL_VERTEX_SHADER, VERT_SHADER_SOURCE);
+ GLuint FragShaderName = glf::createShader(GL_FRAGMENT_SHADER, FRAG_SHADER_SOURCE);
ProgramName = glCreateProgram();
- glAttachShader(ProgramName, VertexShaderName);
- glAttachShader(ProgramName, FragmentShaderName);
- glDeleteShader(VertexShaderName);
- glDeleteShader(FragmentShaderName);
+ glAttachShader(ProgramName, VertShaderName);
+ glAttachShader(ProgramName, FragShaderName);
+ glDeleteShader(VertShaderName);
+ glDeleteShader(FragShaderName);
glLinkProgram(ProgramName);
Validated = glf::checkProgram(ProgramName);
10 samples/ogl-420-texture-2d-pixel-store.cpp
View
@@ -162,6 +162,16 @@ bool initTexture2D()
0,
LevelSize,
Texture[Level].data());
+
+ //glCompressedTexSubImage2D(
+ // GL_TEXTURE_2D,
+ // GLint(Level),
+ // 0, 0,
+ // LevelWidth,
+ // LevelHeight,
+ // GL_COMPRESSED_RGB_S3TC_DXT1_EXT,
+ // LevelSize,
+ // Texture[Level].data());
}
glActiveTexture(GL_TEXTURE0);
18 samples/ogl-420-texture-compressed.cpp
View
@@ -75,9 +75,9 @@ namespace
};
}//namespace texture
- GLuint VertexArrayName(0);
+ GLuint PipelineName(0);
GLuint ProgramName(0);
-
+ GLuint VertexArrayName(0);
GLuint SamplerName(0);
GLuint BufferName[buffer::MAX] = {0, 0, 0};
GLuint Texture2DName[texture::MAX] = {0, 0, 0, 0};
@@ -90,12 +90,16 @@ bool initProgram()
{
bool Validated(true);
+ glGenProgramPipelines(1, &PipelineName);
+ glBindProgramPipeline(PipelineName);
+
if(Validated)
{
GLuint VertShaderName = glf::createShader(GL_VERTEX_SHADER, VERT_SHADER_SOURCE);
GLuint FragShaderName = glf::createShader(GL_FRAGMENT_SHADER, FRAG_SHADER_SOURCE);
ProgramName = glCreateProgram();
+ glProgramParameteri(ProgramName, GL_PROGRAM_SEPARABLE, GL_TRUE);
glAttachShader(ProgramName, VertShaderName);
glAttachShader(ProgramName, FragShaderName);
glDeleteShader(VertShaderName);
@@ -105,6 +109,11 @@ bool initProgram()
Validated = glf::checkProgram(ProgramName);
}
+ if(Validated)
+ glUseProgramStages(PipelineName, GL_VERTEX_SHADER_BIT | GL_FRAGMENT_SHADER_BIT, ProgramName);
+
+ glBindProgramPipeline(0);
+
return Validated;
}
@@ -358,9 +367,8 @@ void display()
// Clear the color buffer
glClearBufferfv(GL_COLOR, 0, &glm::vec4(1.0f, 0.5f, 0.0f, 1.0f)[0]);
- // Bind draw inputs
- glUseProgram(ProgramName);
-
+ // Bind rendering objects
+ glBindProgramPipeline(PipelineName);
glBindBufferBase(GL_UNIFORM_BUFFER, glf::semantic::uniform::TRANSFORM0, BufferName[buffer::TRANSFORM]);
glBindSampler(0, SamplerName);
glBindVertexArray(VertexArrayName);
2  samples/ogl-420-transform-feedback-instanced.cpp
View
@@ -93,7 +93,7 @@ bool initProgram()
glDeleteShader(VertShaderName);
glDeleteShader(GeomShaderName);
- GLchar const * Strings[] = {"gl_Position", "block.Color"};
+ GLchar const * Strings[] = {"gl_PerVertex.gl_Position", "block.Color"};
glTransformFeedbackVaryings(ProgramName[pipeline::TRANSFORM], 2, Strings, GL_INTERLEAVED_ATTRIBS);
glLinkProgram(ProgramName[pipeline::TRANSFORM]);

No commit comments for this range

Something went wrong with that request. Please try again.