opengl-点精灵渲染问题

opengl-点精灵渲染问题,opengl,glsl,opengl-3,Opengl,Glsl,Opengl 3,我试图渲染点精灵,但我得到了点。问题在哪里?(通过glUniform3f works更改颜色) 顶点着色器: private static String vertexShader = "#version 330" + "\n" + "layout (location = 0) in vec4 position;" + "\n" + "uniform mat4 pMatrix;" + "\n" + "uniform mat4 mMatrix;" + "\n" + "void main()" + "

我试图渲染点精灵,但我得到了点。问题在哪里?(通过glUniform3f works更改颜色)

顶点着色器:

private static String vertexShader =
"#version 330" + "\n" +
"layout (location = 0) in vec4 position;" + "\n" +
"uniform mat4 pMatrix;" + "\n" +
"uniform mat4 mMatrix;" + "\n" +
"void main()" + "\n" +
"{" + "\n" +
"gl_Position = pMatrix * mMatrix * position;" + "\n" +
"}";
片段着色器:

private static String fragmentShader =
"#version 330" + "\n" +
"out vec4 vFragColor;" + "\n" +
"uniform vec3 Color;" + "\n" +
"uniform vec3 lightDir;" + "\n" +
"void main()" + "\n" +
"{" + "\n" +
"vec3 N;" + "\n" +
"N.xy = gl_PointCoord* 2.0 - vec2(1.0);" + "\n" +    
"float mag = dot(N.xy, N.xy);" + "\n" +
"if (mag > 1.0) discard;" + "\n" +   
"N.z = sqrt(1.0-mag);" + "\n" +
"float diffuse = max(0.0, dot(lightDir, N));" + "\n" +
"vFragColor = vec4(Color,1) * diffuse;" + "\n" +
"}";
渲染:

gl.glUseProgram(shaderProgramID);
gl.glUniformMatrix4fv(projectionMatrixUniform, 1, false, projectionMatrix, 0);
gl.glUniformMatrix4fv(modelViewMatrixUniform, 1, false, modelViewMatrix, 0);
gl.glUniform3f(colorUniform, 1.0f, 0.0f, 0.0f);
gl.glUniform3f(lightDirUniform, 0.0f, 0.0f, 1.0f);
gl.glBindBuffer(GL3.GL_ARRAY_BUFFER, vbo[0]);
gl.glEnableVertexAttribArray(0);
gl.glVertexAttribPointer(0, 4, GL3.GL_FLOAT, false, 0, 0);
gl.glDrawArrays(GL3.GL_POINTS, 0, n_particles);
gl.glDisableVertexAttribArray(0);
gl.glUseProgram(0);

为什么不简单地使用几何体着色器呢? 只需将变换后的顶点位置传递给几何体着色器,然后让几何体着色器围绕该点输出四个顶点,即可完成。 它更加灵活和稳定

示例:

void main()
{
  gl_TexCoord[0] = gl_MultiTexCoord0;

  // Output vertex position
  gl_Position = gl_ModelViewMatrix * gl_Vertex;
}
#extension GL_EXT_geometry_shader4 : enable

uniform float particle_size;

void main()
{
    float halfsize = particle_size * 0.5;

    gl_TexCoord[0] = gl_TexCoordIn[0][0];
    gl_FrontColor = gl_FrontColorIn[0];

     // Vertex 4
    gl_TexCoord[0].st = vec2(1.0,1.0);
    gl_Position = gl_PositionIn[0];
    gl_Position = gl_ProjectionMatrix  * gl_Position;
    gl_Position.xy += vec2(halfsize, halfsize);
    EmitVertex();

    // Vertex 3
    gl_TexCoord[0].st = vec2(1.0,-1.0);
    gl_Position = gl_PositionIn[0];
    gl_Position = gl_ProjectionMatrix  * gl_Position;
    gl_Position.xy += vec2(halfsize, -halfsize);
    EmitVertex();

    // Vertex 2
    gl_TexCoord[0].st = vec2(-1.0,1.0);
    gl_Position = gl_PositionIn[0];
    gl_Position = gl_ProjectionMatrix  * gl_Position;
    gl_Position.xy += vec2(-halfsize, halfsize);
    EmitVertex();

    // Vertex 1
    gl_TexCoord[0].st = vec2(-1.0,-1.0);
    gl_Position = gl_PositionIn[0];
    gl_Position = gl_ProjectionMatrix  * gl_Position;
    gl_Position.xy += vec2(-halfsize, -halfsize);
    EmitVertex();



    EndPrimitive();
}
顶点着色器:

void main()
{
  gl_TexCoord[0] = gl_MultiTexCoord0;

  // Output vertex position
  gl_Position = gl_ModelViewMatrix * gl_Vertex;
}
#extension GL_EXT_geometry_shader4 : enable

uniform float particle_size;

void main()
{
    float halfsize = particle_size * 0.5;

    gl_TexCoord[0] = gl_TexCoordIn[0][0];
    gl_FrontColor = gl_FrontColorIn[0];

     // Vertex 4
    gl_TexCoord[0].st = vec2(1.0,1.0);
    gl_Position = gl_PositionIn[0];
    gl_Position = gl_ProjectionMatrix  * gl_Position;
    gl_Position.xy += vec2(halfsize, halfsize);
    EmitVertex();

    // Vertex 3
    gl_TexCoord[0].st = vec2(1.0,-1.0);
    gl_Position = gl_PositionIn[0];
    gl_Position = gl_ProjectionMatrix  * gl_Position;
    gl_Position.xy += vec2(halfsize, -halfsize);
    EmitVertex();

    // Vertex 2
    gl_TexCoord[0].st = vec2(-1.0,1.0);
    gl_Position = gl_PositionIn[0];
    gl_Position = gl_ProjectionMatrix  * gl_Position;
    gl_Position.xy += vec2(-halfsize, halfsize);
    EmitVertex();

    // Vertex 1
    gl_TexCoord[0].st = vec2(-1.0,-1.0);
    gl_Position = gl_PositionIn[0];
    gl_Position = gl_ProjectionMatrix  * gl_Position;
    gl_Position.xy += vec2(-halfsize, -halfsize);
    EmitVertex();



    EndPrimitive();
}
几何体着色器:

void main()
{
  gl_TexCoord[0] = gl_MultiTexCoord0;

  // Output vertex position
  gl_Position = gl_ModelViewMatrix * gl_Vertex;
}
#extension GL_EXT_geometry_shader4 : enable

uniform float particle_size;

void main()
{
    float halfsize = particle_size * 0.5;

    gl_TexCoord[0] = gl_TexCoordIn[0][0];
    gl_FrontColor = gl_FrontColorIn[0];

     // Vertex 4
    gl_TexCoord[0].st = vec2(1.0,1.0);
    gl_Position = gl_PositionIn[0];
    gl_Position = gl_ProjectionMatrix  * gl_Position;
    gl_Position.xy += vec2(halfsize, halfsize);
    EmitVertex();

    // Vertex 3
    gl_TexCoord[0].st = vec2(1.0,-1.0);
    gl_Position = gl_PositionIn[0];
    gl_Position = gl_ProjectionMatrix  * gl_Position;
    gl_Position.xy += vec2(halfsize, -halfsize);
    EmitVertex();

    // Vertex 2
    gl_TexCoord[0].st = vec2(-1.0,1.0);
    gl_Position = gl_PositionIn[0];
    gl_Position = gl_ProjectionMatrix  * gl_Position;
    gl_Position.xy += vec2(-halfsize, halfsize);
    EmitVertex();

    // Vertex 1
    gl_TexCoord[0].st = vec2(-1.0,-1.0);
    gl_Position = gl_PositionIn[0];
    gl_Position = gl_ProjectionMatrix  * gl_Position;
    gl_Position.xy += vec2(-halfsize, -halfsize);
    EmitVertex();



    EndPrimitive();
}

我没有看到启用点精灵或设置相应参数的代码。我也不确定它们是否已经被弃用(如果您有一个核心上下文,这可能是一个问题)。已解决。我忘了设置glPointSize(默认值为球体看起来像点)。如果OpenGL 3.3及以上版本中不推荐使用点精灵,那么实现类似效果的最佳方法是什么?我需要一个有效的方法,可以用来渲染粒子引擎。点精灵没有从3.3核心删除。但一般来说,不应该使用点精灵,因为它们的某些行为,特别是在剪裁方面,是有问题的。在NVIDIA硬件上,它们遵循您期望的规则。在AMD硬件上,它们遵循规范规定的规则:它们被剪裁在点的中心。因此,如果中心在屏幕外,整个点将消失,即使它的一部分应该是可见的。当我试图创建一些碰撞检测等时,使用glPointSize没有任何意义。在转换点精灵时,缩放也存在问题。也许我应该在顶点着色器中使用一些变量,它们表示球体的半径、距离和一些比例因子。有什么想法吗?@Lynx如果你真的想使用点精灵,最好在顶点着色器中计算点大小,使其依赖于对象空间而不是屏幕空间,因此,远处的精灵比附近的精灵小。实际上,我认为你可以简单地在顶点着色器中将顶点位置与gl_ModelViewProjectionMatrix相乘,而不是在顶点和几何体着色器中分别进行相乘。。。我没有测试代码,但它只是作为一个示例。