PDA

View Full Version : drawcall with no data possible ?



_blitz
09-15-2010, 08:24 AM
Hi,
I'm coding an instance-culling shader, which works in 2 passes.
In the first pass, I compute the instance position with the VertexID, perform a visibility test, and get the visible IDs back with Transform Feedback. So, I don't need any vertex attribute data. The vertex Shader compiles fine and the program links. Now, how do I feed the pipeline from the client's perspective ? Binding an empty VAO crashes the application, and I don't want (unless I really have to) create a dummy VBO for the process... Any suggestions on how I could do this ?
Here's the vertex-shader code

#version 400 core

// patch parameters
layout(std140) uniform PatchParams
{
int cst_patchCountSqrt; ///< Square root of the total number of patches
int cst_patchSize; ///< Patch Side Length
};

// camera view
layout(std140) uniform View
{
mat4 cst_view; ///< View Matrix
};

// projection matrix
uniform mat4 cst_projection;


// output
out vec4 var_pos;
flat out int var_isCulled;

void main()
{
// compute position in the grid
vec2 gridpos = vec2(gl_VertexID/cst_patchCountSqrt, gl_VertexID%cst_patchCountSqrt);
// mulitply offset by patch Size to get proper position
float offset = float(cst_patchCountSqrt)/2.0;
vec2 pos = (gridpos-vec2(offset))*vec2(cst_patchSize);
var_pos = vec4(pos,0.0,1.0);


// project
vec4 clipPos = cst_projection * (cst_view * var_pos);


// check visibility
if(clipPos.x < -clipPos.w) var_isCulled = 1;
else if(clipPos.x > clipPos.w) var_isCulled = 1;
else if(clipPos.y < -clipPos.w) var_isCulled = 1;
else if(clipPos.y > clipPos.w) var_isCulled = 1;
else if(clipPos.z < -clipPos.w) var_isCulled = 1;
else if(clipPos.z > clipPos.w) var_isCulled = 1;
else var_isCulled = 0;

}
And the draw call

glUseProgram(program[PROGRAM_FEEDBACK]);
glBindVertexArray(vertexArray[VERTEX_ARRAY_CULL]); // empty, crashes the app
glDrawArrays(GL_POINTS, 0, SAMPLE_PATCH_COUNT);

DmitryM
09-15-2010, 09:21 AM
I experienced the same issue... Creating a dummy VBO with 1 byte per vertex now - not a big deal.

Alfonse Reinheart
09-15-2010, 10:27 AM
There is no current mechanism to do this in OpenGL. You always have to have at least one active attribute.

randall
09-15-2010, 11:13 AM
How can binding empty VAO crash the app? What with first binding then? This is not the case on NVIDIA. My app draws with ALL vertex arrays disabled (no buffers attached) and it works perfectly well (I haven't checked ATI though).

This is my Vertex Shader:



N "#version 150"
N "uniform int R = 60;"
N "void main() {"
N " vec2 p = vec2(gl_VertexID % R, gl_VertexID / R) / R;"
N " gl_Position = vec4(p, 0, 1);"
N "}";

_blitz
09-15-2010, 02:03 PM
Ok well I suppose I'll have to go with the dummy array then. Strange that a vertex shader can compile with no 'in' variables if it crashes a client trying to feed it...

DmitryM
09-16-2010, 09:24 AM
That's a very simple bug of the ATI Catalyst that is still not fixed for the unknown reason. Maybe we should report it directly to them? Anyway, there are ATI guys on this forum, I hope they'll visit the thread some day.