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);
}
}
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)
Вы шо, рофлите?ARBShaderObjects
Это не директ буффер.FloatBuffer.wrap
А это директ.BufferUtils.createFloatBuffer
Для одного флоата там есть специальный метод. Не нужно городить.Это крашит:
Ну в гайде это написали, теперь все будут это писать. Хотя бы объяснили всем почему не надо ARB юзатьВы шо, рофлите?
Vazkii юзает и ничеВы шо, рофлите?
Да используйте, кто вам мешает. Только не надо этому учить других.Vazkii юзает и ниче
Не вроде, а так и есть.Оно устаревшее, вроде.
Значение времени то изменяетсяНо не нужно, плез, создавать каждый раз новый буфер! Используйте статически созданный буфер.
Эм, как бы можно использовать уже созданный FloatBuffer и просто менять данные. Как у того же MutableBlockPos или как там его.Значение времени то изменяется
Для одного флоата там есть специальный метод. Не нужно городить.
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(...))