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

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

CumingSoon

Местный стендапер
1,634
12
269
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);
    }
}
 
Последнее редактирование:
7,099
324
1,509
Чему соответствует iChannel0 из ShaderToy в lwjgl?
 
7,099
324
1,509
Как правильно работать с юниформами?

Это крашит:
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)
 

Icosider

Kotliner
Администратор
3,600
99
663
@hohserg1:
Kotlin:
fun floatBuf(vararg data: Float): FloatBuffer
{
    val buffer = BufferUtils.createFloatBuffer(data.size)
    buffer.put(data)
    buffer.flip()
    return buffer
}
 
2,505
81
397
Вы шо, рофлите?

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

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

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

Для одного флоата там есть специальный метод. Не нужно городить.
 
7,099
324
1,509
7,099
324
1,509
@Ivasik, спасибо, работает!
 
7,099
324
1,509
Вот так не пашет, крашит с ошибкой 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)
 
7,099
324
1,509
glUniform1fARB
 
7,099
324
1,509
Что на счет использования юниформы 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(...))
Эффект как будто не трогаю эту юниформу
Что я делаю неправильно?
 
Последнее редактирование:

CumingSoon

Местный стендапер
1,634
12
269
Номер слота нужно указать вместо GlStateManager.activeTextureUnit. Тут будет 1
 
Сверху