Subject
----
I am creating a terrain map with triangle strips and I would like to make the bodies of the triangles black, but have their outlines be colored.
-----
Problem
---
The solution appears to be to draw the triangles twice, once in solid black, using `GL_FILL` and once in color using `GL_LINES`.
The problem with this approach is that, since I am using depth testing and the vertices are at the same position each time, my color lines end up blending with the black lines
![][1]
----------------------------
Attempted Solution
------
According to the OpenGL docs, and other sources, it looks like I should be able to utilize the [glPolygonOffset()][2] function to give polygons that are drawn with `GL_LINES` "precedence" in the depth buffer by offsetting their comparison value by the argument to the function. (so I would think 1.0 would be sufficient)
This, however, does not appear to be working for me.
---------------
My Code
----
I have placed `glEnable(GL_POLYGON_OFFSET_LINE);` in my init function.
Here is the code in my draw loop where I do the actual rendering. `col` is the array that hods the real colors, `col2` is filled with black.
Please excuse the mess.
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPolygonOffset(1.0,0.0);
glDeleteBuffers(1,&vertex_buffer);
vertex_buffer = createBuffer(GL_ARRAY_BUFFER, vert, sizeof(GLfloat)*(buffer_size), GL_STATIC_DRAW);
attributeBind(vertex_buffer, 0, 3);
glDeleteBuffers(1,&color_buffer);
color_buffer = createBuffer(GL_ARRAY_BUFFER, col2, sizeof(GLfloat)*(buffer_size), GL_STATIC_DRAW);
attributeBind(color_buffer, 1, 3);
glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
glDrawArrays(GL_TRIANGLE_STRIP,0,s);
glDeleteBuffers(1,&color_buffer);
color_buffer = createBuffer(GL_ARRAY_BUFFER, col, sizeof(GLfloat)*(buffer_size), GL_STATIC_DRAW);
attributeBind(color_buffer, 1, 3);
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
glDrawArrays(GL_TRIANGLE_STRIP,0,s);
I'm not sure if I need to call `glPolygonOffset()` each frame or not.
These are the `attributeBind()` and `createbuffer()` functions:
void attributeBind(GLuint buffer, int index, int points)
{
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glVertexAttribPointer(
index, // position or color
points, // how many dimensions?
GL_FLOAT, // type
GL_FALSE, // normalized?
0, // stride
(void*)0 // array buffer offset
);
}
GLuint createBuffer(GLenum target, const void *buffer_data, GLsizei buffer_size, GLenum usageHint)
{
GLuint buffer;
glGenBuffers(1, &buffer);
glBindBuffer(target, buffer);
glBufferData(target, buffer_size, buffer_data, usageHint);
return buffer;
}
[1]: https://i.sstatic.net/nYgl1.png
[2]: https://www.opengl.org/sdk/docs/man/html/glPolygonOffset.xhtml