Так! Всем привет, я вернулся )
В общем, немного почитав/посмотрев туторы, пришёл к выводу, что загрузка шейдеров через .json мне не подходит, так как управлять параметрами не получится. Так что придётся шейдерную программу писать самому.
Ну, как самому, её я тоже взял с примера
Однако, не очень понятно, каким образом её запускать в майне и как пихать туда майновскую сцену.
Пока что вопроса/проблемы две:
Первое: в нужном ли месте я запускаю программу?
private ShaderProgram shader = new ShaderProgram();
@SubscribeEvent
@SideOnly(Side.CLIENT)
public void onRenderFogEvent(RenderFogEvent e)
{
shader.start();
}
По идее, грузить всё это надо как раз на моменте просчёта тумана. При этом, не понятно, когда ж её останавливать.
Второе: чо-та как-то (видимо, я совсем не знаю java), не получается найти сами файлы шейдеров.
Как правильно прописывать путь для BufferedReader?
Сама программа:
package ru.liahim.mist.shaders;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import javax.vecmath.Vector3f;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL20;
public class ShaderProgram {
private static final String VERTEX_FILE = "mist/shaders/V1.txt";
private static final String FRAGMENT_FILE = "mist/shaders/F1.txt";
private int programID;
private int vertexShaderID;
private int fragmentShaderID;
private int hightID;
private int colorID;
public ShaderProgram() {
vertexShaderID = loadShader(VERTEX_FILE, GL20.GL_VERTEX_SHADER);
fragmentShaderID = loadShader(FRAGMENT_FILE, GL20.GL_FRAGMENT_SHADER);
programID = GL20.glCreateProgram();
GL20.glAttachShader(programID, vertexShaderID);
GL20.glAttachShader(programID, fragmentShaderID);
GL20.glLinkProgram(programID);
GL20.glValidateProgram(programID);
getUniformLocation();
}
protected void getUniformLocation() {
hightID = getUniformLocation("hight");
colorID = getUniformLocation("color");
}
protected int getUniformLocation(String uniformName) {
return GL20.glGetUniformLocation(programID, uniformName);
}
protected void loadFloat(int location, float value) {
GL20.glUniform1f(location, value);
}
protected void loadVector(int location, Vector3f vector) {
GL20.glUniform3f(location, vector.x, vector.y, vector.z);
}
protected void loadBoolean(int location, boolean value) {
float toLoad = 0;
if (value) toLoad = 1;
GL20.glUniform1f(location, toLoad);
}
public void start() {
GL20.glUseProgram(programID);
}
public void stop() {
GL20.glUseProgram(0);
}
public void cleanUp() {
stop();
GL20.glDetachShader(programID, vertexShaderID);
GL20.glDetachShader(programID, fragmentShaderID);
GL20.glDeleteShader(vertexShaderID);
GL20.glDeleteShader(fragmentShaderID);
GL20.glDeleteProgram(programID);
}
private static int loadShader(String file, int type) {
StringBuilder shaderSource = new StringBuilder();
try {
BufferedReader reader = new BufferedReader(new FileReader(file));
String line;
while((line = reader.readLine()) != null) {
shaderSource.append(line).append("\n");
}
reader.close();
} catch(IOException e) {
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;
}
}
При запуске пишет следующее:
java.io.FileNotFoundException: mist\shaders\V1.txt (Системе не удается найти указанный путь)
[merge_posts_bbcode]Добавлено: 17.06.2016 08:29:19[/merge_posts_bbcode]
P.S.
Предположение по загрузке программы :\
private Minecraft mc = Minecraft.getMinecraft();
private ShaderProgram shader = new ShaderProgram();
@SubscribeEvent
@SideOnly(Side.CLIENT)
public void onRenderFogEvent(RenderFogEvent e)
{
shader.start();
this.mc.getFramebuffer().createBindFramebuffer(this.mc.displayWidth, this.mc.displayHeight);
shader.stop();
}