当我将几何着色器添加到着色器程序时,对象不渲染

When I add geometric shader to shaderprogram than object dont render

我用 thinmatrix 的 tutoterial 编写我的游戏代码,当我将几何着色器添加到水中时。比水不显示。

这是我的 ShaderProgram:

package shaders;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.FloatBuffer;

import org.lwjgl.BufferUtils;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL20;
import org.lwjgl.opengl.GL32;
import org.lwjgl.util.vector.Matrix4f;
import org.lwjgl.util.vector.Vector2f;
import org.lwjgl.util.vector.Vector3f;
import org.lwjgl.util.vector.Vector4f;

public abstract class ShaderProgram {
    
    private int programID;
    private int vertexShadreID;
    private int fragmentShaderID;   
    private int geometryShaderID;
    private boolean havegeometry = false;
    
    private static FloatBuffer matrixBuffer = BufferUtils.createFloatBuffer(16);
    
    public ShaderProgram(String vertexFile, String fragmentFile) {
        vertexShadreID = loadShader(vertexFile, GL20.GL_VERTEX_SHADER);

        fragmentShaderID = loadShader(fragmentFile, GL20.GL_FRAGMENT_SHADER);
        programID = GL20.glCreateProgram();
        GL20.glAttachShader(programID, vertexShadreID);
        GL20.glAttachShader(programID, fragmentShaderID);

        bindAttributes();
        GL20.glLinkProgram(programID);
        GL20.glValidateProgram(programID);
        getAllUniformLocations();
    }
    public ShaderProgram(String vertexFile, String fragmentFile, String geometry) {
        vertexShadreID = loadShader(vertexFile, GL20.GL_VERTEX_SHADER);
        geometryShaderID = loadShader(geometry, GL32.GL_GEOMETRY_SHADER);
        fragmentShaderID = loadShader(fragmentFile, GL20.GL_FRAGMENT_SHADER);
        
        programID = GL20.glCreateProgram();
        GL20.glAttachShader(programID, vertexShadreID);

        GL20.glAttachShader(programID, geometryShaderID);
        GL20.glAttachShader(programID, fragmentShaderID);
        bindAttributes();
        havegeometry = true;
        GL20.glLinkProgram(programID);
        GL20.glValidateProgram(programID);
        getAllUniformLocations();

    }
    protected abstract void getAllUniformLocations();
    
    protected int getUniformLocation(String uniformName) {
        return GL20.glGetUniformLocation(programID, uniformName);
    }
    
    public void start() {
        GL20.glUseProgram(programID);
    }
    
    public void stop() {
        GL20.glUseProgram(0);
    }
    
    public void cleanUp() {
        stop();
        GL20.glDetachShader(programID, vertexShadreID);
        GL20.glDetachShader(programID, fragmentShaderID);
        if(havegeometry) {
            GL20.glDetachShader(programID, geometryShaderID);
            GL20.glDeleteShader(geometryShaderID);
            
        }
        GL20.glDeleteShader(vertexShadreID);

        GL20.glDeleteShader(fragmentShaderID);
        GL20.glDeleteShader(programID);
        
        
    }
    
    protected abstract void bindAttributes();
    
    protected void bindAttribute(int attribute, String variableName) {
        GL20.glBindAttribLocation(programID, attribute, variableName);
    }
    
    protected void loadFloat(int location, float value) {
        GL20.glUniform1f(location, value);
    }
    
    protected void loadInt(int location, int value) {
        GL20.glUniform1i(location, value);
    }

    protected void loadVector(int location, Vector3f vector) {
        GL20.glUniform3f(location, vector.x, vector.y, vector.z);
    }
    
    protected void loadVector(int location, Vector4f vector) {
        GL20.glUniform4f(location, vector.x, vector.y, vector.z, vector.w);
    }
    
    protected void load2DVector(int location, Vector2f vector) {
        GL20.glUniform2f(location, vector.x, vector.y);
    }
    
    protected void loadBoolean(int location, boolean value) {
        float toLoad = 0;
        if(value) {
            toLoad = 1;
        }
        GL20.glUniform1f(location, toLoad);
    }
    
    protected void loadMatrix(int location, Matrix4f matrix) {
        matrix.store(matrixBuffer);
        matrixBuffer.flip();
        GL20.glUniformMatrix4(location, false, matrixBuffer);
    }
    
    private static int loadShader(String file, int type) {
        StringBuilder shaderSource = new StringBuilder();
        InputStream in = ShaderProgram.class.getResourceAsStream(file);
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(in))) {
            String line;
            while((line = reader.readLine()) != null) {
                shaderSource.append(line).append("\n");
            }
        } catch (IOException e) {
            System.err.println("Could not read file!");
            e.printStackTrace();
            System.exit(-1);
        }
        int shaderID = GL20.glCreateShader(type);
        GL20.glShaderSource(shaderID, shaderSource);
        GL20.glCompileShader(shaderID);
        if(GL20.glGetShaderi(shaderID, GL20.GL_COMPILE_STATUS) == GL11.GL_FALSE){
            System.out.println(GL20.glGetShaderInfoLog(shaderID, 500));
            System.err.println("Could not compile shader.");
            System.exit(-1);
        }
        
        return shaderID;
    }
}

这是我的 WaterShader:

package water;

import org.lwjgl.util.vector.Matrix4f;
import org.lwjgl.util.vector.Vector3f;

import entities.Camera;
import entities.Light;
import shaders.ShaderProgram;
import toolbox.Maths;

public class WaterShader extends ShaderProgram {

    private final static String VERTEX_FILE = "/water/waterVertex.txt";
    private final static String FRAGMENT_FILE = "/water/waterFragment.txt";
    private final static String GEOMETRY_FILE = "/water/waterGeometry.txt";

    private int location_modelMatrix;
    private int location_viewMatrix;
    private int location_projectionMatrix;
    private int location_reflection;
    private int location_refraction;
    private int location_dudvMap;
    private int location_moveFactor;
    private int location_cameraPosition;
    private int location_normalMap;
    private int location_lightColour;
    private int location_lightPosition;
    private int location_depthMap;
    private int location_skyColour;

    public WaterShader() {
        super(VERTEX_FILE, FRAGMENT_FILE,GEOMETRY_FILE);
    }

    @Override
    protected void bindAttributes() {
        bindAttribute(0, "position");
    }

    @Override
    protected void getAllUniformLocations() {
        location_projectionMatrix = getUniformLocation("projectionMatrix");
        location_viewMatrix = getUniformLocation("viewMatrix");
        location_modelMatrix = getUniformLocation("modelMatrix");
        location_reflection = getUniformLocation("reflectionTexture");
        location_refraction = getUniformLocation("refractionTexture");
        location_dudvMap = getUniformLocation("dudvMap");
        location_moveFactor = getUniformLocation("moveFactor");
        location_cameraPosition = getUniformLocation("cameraPosition");
        location_normalMap = getUniformLocation("normalMap");
        location_lightColour = getUniformLocation("lightColour");
        location_lightPosition = getUniformLocation("lightPosition");
        location_depthMap = getUniformLocation("depthMap");
        location_skyColour = super.getUniformLocation("skyColour");
    }
    
    public void connectTextureUnits() {
        super.loadInt(location_reflection, 0);
        super.loadInt(location_refraction, 1);
        super.loadInt(location_dudvMap, 2);
        super.loadInt(location_normalMap, 3);
        super.loadInt(location_depthMap, 4);
    }
    
    public void loadLight(Light sun) {
        super.loadVector(location_lightColour, sun.getColour());
        super.loadVector(location_lightPosition, sun.getPosition());
    }
    
    public void loadSkyColour(Vector3f colour){
        super.loadVector(location_skyColour, colour);
    }
    
    public void loadMoveFactor(float factor) {
        super.loadFloat(location_moveFactor, factor);
    }

    public void loadProjectionMatrix(Matrix4f projection) {
        loadMatrix(location_projectionMatrix, projection);
    }
    
    public void loadViewMatrix(Camera camera){
        Matrix4f viewMatrix = Maths.createViewMatrix(camera);
        loadMatrix(location_viewMatrix, viewMatrix);
        super.loadVector(location_cameraPosition, camera.getPosition());
    }

    public void loadModelMatrix(Matrix4f modelMatrix){
        loadMatrix(location_modelMatrix, modelMatrix);
    }

}

这是我的几何着色器:

#version 430 core

void main(void)
{
}

我想创建 FFTwater。

您有一个空的几何着色器,这就是没有渲染任何内容的原因。更准确地说,几何着色器应该显式输出顶点和基元(参见 EndVertex() 和 EndPrimitive())。您的几何着色器不会执行此操作,有效地输出零基元。我建议您探索一些关于几何着色器的资源,例如 https://www.khronos.org/opengl/wiki/Geometry_Shader or https://learnopengl.com/Advanced-OpenGL/Geometry-Shader.