Шейдеры GLSL [ч.2 - Добавление в игру] [upd: ч.2.5 - логирование ошибок]

Шейдеры GLSL [ч.2 - Добавление в игру] [upd: ч.2.5 - логирование ошибок]

Java:
import static org.lwjgl.opengl.GL20.*;

public class Shader {
    private int programId;
    private int[] shaders;

    public Shader(int programId, int[] shaders) {
        this.programId = programId;
        this.shaders = shaders;
    }

    public int getProgramId() {
        return programId;
    }

    public int[] getShaders() {
        return shaders;
    }

    public void free() {
        for (int shader : shaders) {
            glDetachShader(programId, shader);
            glDeleteShader(shader);
        }
        glDeleteProgram(programId);
    }

    public static int createShader(int type, String code) {
        int shader = glCreateShader(type);
        glShaderSource(shader, code);
        glCompileShader(shader);
        if (glGetShaderi(shader, GL_COMPILE_STATUS) == GL11.GL_FALSE)
            System.err.println(glGetShaderInfoLog(shader, GL_INFO_LOG_LENGTH));
        return shader;
    }

    public static Shader createProgram(int... shaders) {
        int program = glCreateProgram();
        for (int shader : shaders) {
            glAttachShader(program, shader);
        }
        glLinkProgram(program);
        glValidateProgram(program);
        // Dahaka что-то говорил о детаче шейдеров вот тут
        if (glGetProgrami(program, GL_VALIDATE_STATUS) == GL11.GL_FALSE)
            System.err.println(glGetProgramInfoLog(program, GL_INFO_LOG_LENGTH));
        return new Shader(program, shaders);
    }
}
 
Последнее редактирование:
Чему соответствует iChannel0 из ShaderToy в lwjgl?
 
Как правильно работать с юниформами?

Это крашит:
Scala:
val uniformID = ARBShaderObjects.glGetUniformLocationARB(programID, "iTime")
ARBShaderObjects.glUniform1ARB(uniformID, FloatBuffer.wrap(Array(mc.world.getWorldTime.toFloat)))
Код:
java.lang.IllegalArgumentException: FloatBuffer is not direct
    at org.lwjgl.BufferChecks.checkDirect(BufferChecks.java:139)
    at org.lwjgl.opengl.ARBShaderObjects.glUniform1ARB(ARBShaderObjects.java:245)
 
@hohserg1:
Kotlin:
fun floatBuf(vararg data: Float): FloatBuffer
{
    val buffer = BufferUtils.createFloatBuffer(data.size)
    buffer.put(data)
    buffer.flip()
    return buffer
}
 
Вы шо, рофлите?

Это не директ буффер.

BufferUtils.createFloatBuffer
А это директ.

Но не нужно, плез, создавать каждый раз новый буфер! Используйте статически созданный буфер.

Для одного флоата там есть специальный метод. Не нужно городить.
 
@Ivasik, спасибо, работает!
 
Вот так не пашет, крашит с ошибкой out of bounds
Scala:
lazy val buffer = BufferUtils.createFloatBuffer(1)

def floatBuf(data: Float): FloatBuffer =
{
    buffer.put(0,data)
    buffer.flip()
    buffer
}

private def iTime = floatBuf(mc.world.getWorldTime.toFloat)
 
glUniform1fARB
 
Что на счет использования юниформы sampler2D? Например, если хочу работать с текущей текстурой в шейдере?
Попробовал так:
Scala:
GL20.glUseProgram(id)
val uniformID = GL20.glGetUniformLocation(id, "img")//она там uniform sampler2D img
GL20.glUniform1i(uniformID, GlStateManager.activeTextureUnit /*OpenGlHelper.defaultTexUnit - GL13.GL_TEXTURE0*/)
//GL33.glBindSampler(GlStateManager.activeTextureUnit, uniformID)
bindTexture(new ResourceLocation(...))
Эффект как будто не трогаю эту юниформу
Что я делаю неправильно?
 
Последнее редактирование:
Номер слота нужно указать вместо GlStateManager.activeTextureUnit. Тут будет 1
 
Назад
Сверху