biddeschön
kskb
[spoiler]```package de.skysoldier.agl2test;
import static org.lwjgl.opengl.GL11.GL_FALSE;
import static org.lwjgl.opengl.GL20.GL_COMPILE_STATUS;
import static org.lwjgl.opengl.GL20.GL_INFO_LOG_LENGTH;
import static org.lwjgl.opengl.GL20.GL_LINK_STATUS;
import static org.lwjgl.opengl.GL20.glGetProgramInfoLog;
import static org.lwjgl.opengl.GL20.glGetProgrami;
import static org.lwjgl.opengl.GL20.glGetShaderInfoLog;
import static org.lwjgl.opengl.GL20.glGetShaderi;
import static org.lwjgl.opengl.GL30.GL_TRANSFORM_FEEDBACK_BUFFER;
import java.nio.FloatBuffer;
import org.lwjgl.BufferUtils;
import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL15;
import org.lwjgl.opengl.GL20;
import org.lwjgl.opengl.GL30;
public class TransformFeedbackPorting {
private int floatSizeInBytes = Float.SIZE / 8;
private int argumentCount = 3;
private int firstVao, secondVao;
private int firstBuffer, secondBuffer;
public TransformFeedbackPorting() throws LWJGLException {
// AGLDisplay d = new AGLDisplay(AGLDisplayCap.NONE);
Display.setDisplayMode(new DisplayMode(800, 600));
Display.create();
String vertexShaderContent =
"#version 150
"+
"in float input;
"+
"out float output;
"+
"void main(){
"+
"output = input + 0.1f;
"+
"gl_Position = vec4(input, 0, 0, 1);
"+
“}”;
final int vshaderId = GL20.glCreateShader(GL20.GL_VERTEX_SHADER);
GL20.glShaderSource(vshaderId, vertexShaderContent);
GL20.glCompileShader(vshaderId);
checkCompileErrors(vshaderId);
String fragmentShaderContent =
"#version 150
"+
"out vec4 outColor;
"+
"void main(){
"+
"outColor = vec4(1, 0, 0, 1);
"+
“}”;
final int fshaderId = GL20.glCreateShader(GL20.GL_FRAGMENT_SHADER);
GL20.glShaderSource(fshaderId, fragmentShaderContent);
GL20.glCompileShader(fshaderId);
checkCompileErrors(fshaderId);
final int programId = GL20.glCreateProgram();
GL20.glAttachShader(programId, vshaderId);
GL20.glAttachShader(programId, fshaderId);
GL30.glTransformFeedbackVaryings(programId, new String[] { "output" }, GL30.GL_INTERLEAVED_ATTRIBS);
GL20.glLinkProgram(programId);
checkLinkErrors(programId);
GL20.glUseProgram(programId);
secondVao = GL30.glGenVertexArrays();
GL30.glBindVertexArray(secondVao);
secondBuffer = GL15.glGenBuffers();
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, secondBuffer);
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, argumentCount * floatSizeInBytes, GL15.GL_DYNAMIC_READ);
GL30.glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 0, secondBuffer, 0, argumentCount * floatSizeInBytes);
// GL30.glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, secondBuffer);
firstVao = GL30.glGenVertexArrays();
GL30.glBindVertexArray(firstVao);
final FloatBuffer dataBuffer = BufferUtils.createFloatBuffer(argumentCount);
System.out.println("-- filling buffer");
for(int i = 0; i < argumentCount; i++){
float value = (float) (((i) / (double) argumentCount) * 0.5 - 0.5);
System.out.println(value);
dataBuffer.put(value);
}
dataBuffer.rewind();
System.out.println("-- finished initialization
");
firstBuffer = GL15.glGenBuffers();
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, firstBuffer);
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, dataBuffer, GL15.GL_DYNAMIC_DRAW);
final int inputvert = GL20.glGetAttribLocation(programId, "input");
GL20.glEnableVertexAttribArray(inputvert);
GL20.glVertexAttribPointer(inputvert, 1, GL11.GL_FLOAT, false, 4, 0);
GL11.glPointSize(10);
// testLoop();
testStepByStep();
}
private void testLoop(){
while(!Display.isCloseRequested()){
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
//in buffer2 soll output geschrieben werden
GL30.glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 0, secondBuffer, 0, argumentCount * floatSizeInBytes);
GL30.glBeginTransformFeedback(GL11.GL_POINTS);
//von buffer1 (vao1) soll gelesen also gerendert werden
GL30.glBindVertexArray(firstBuffer);
GL30.glEndTransformFeedback();
GL11.glDrawArrays(GL11.GL_POINTS, 0, argumentCount);
Display.update();
//switch alles (vao und buffer id's)
int temp = secondVao;
secondVao = firstVao;
firstVao = temp;
temp = secondBuffer;
secondBuffer = firstBuffer;
firstBuffer = temp;
}
}
private void testStepByStep(){
/** run 1 **/
GL30.glBindBufferRange(GL30.GL_TRANSFORM_FEEDBACK_BUFFER, 0, secondBuffer, 0, argumentCount * floatSizeInBytes);
GL30.glBeginTransformFeedback(GL11.GL_POINTS);
GL30.glBindVertexArray(firstVao);
GL11.glDrawArrays(GL11.GL_POINTS, 0, argumentCount);
GL30.glEndTransformFeedback();
FloatBuffer result = BufferUtils.createFloatBuffer(argumentCount);
GL15.glGetBufferSubData(GL30.GL_TRANSFORM_FEEDBACK_BUFFER, 0, result);
System.out.println("-- data in transform feedback buffer: ");
for (int i = 0; i < result.capacity(); i++){
System.out.println(result.get(i));
}
System.out.println("-- end, preparing second run..
");
/** run 2 **/
GL30.glBindBufferRange(GL30.GL_TRANSFORM_FEEDBACK_BUFFER, 0, firstBuffer, 0, argumentCount * floatSizeInBytes);
GL30.glBeginTransformFeedback(GL11.GL_POINTS);
GL30.glBindVertexArray(secondVao);
GL11.glDrawArrays(GL11.GL_POINTS, 0, argumentCount);
GL30.glEndTransformFeedback();
result = BufferUtils.createFloatBuffer(argumentCount);
GL15.glGetBufferSubData(GL30.GL_TRANSFORM_FEEDBACK_BUFFER, 0, result);
System.out.println("-- data in transform feedback buffer after round 2: ");
for (int i = 0; i < result.capacity(); i++){
System.out.println(result.get(i));
}
System.out.println("-- end, preparing third run..
");
/** run 3 **/
GL30.glBindBufferRange(GL30.GL_TRANSFORM_FEEDBACK_BUFFER, 0, secondBuffer, 0, argumentCount * floatSizeInBytes);
GL30.glBeginTransformFeedback(GL11.GL_POINTS);
GL30.glBindVertexArray(firstVao);
GL11.glDrawArrays(GL11.GL_POINTS, 0, argumentCount);
GL30.glEndTransformFeedback();
result = BufferUtils.createFloatBuffer(argumentCount);
GL15.glGetBufferSubData(GL30.GL_TRANSFORM_FEEDBACK_BUFFER, 0, result);
System.out.println("-- data in transform feedback buffer after round 3: ");
for (int i = 0; i < result.capacity(); i++){
System.out.println(result.get(i));
}
System.out.println("-- end.
");
}
private void checkCompileErrors(int shaderId){
if (GL_FALSE == glGetShaderi(shaderId, GL_COMPILE_STATUS)){
final int length = glGetShaderi(shaderId, GL_INFO_LOG_LENGTH);
final String log = glGetShaderInfoLog(shaderId, length);
throw new RuntimeException(log);
}
}
private void checkLinkErrors(int programId){
if (GL_FALSE == glGetProgrami(programId, GL_LINK_STATUS)) {
final int length = glGetProgrami(programId, GL_INFO_LOG_LENGTH);
final String log = glGetProgramInfoLog(programId, length);
throw new RuntimeException(log);
}
}
public static void main(final String[] args) throws LWJGLException {
try{
new TransformFeedbackPorting();
}
catch(Exception e){
e.printStackTrace();
}
}
}```[/spoiler]
also bei testLoop flackert alles und ich sehe einen punkt bei (0, 0) der eigentlich nicht existiert,
bei testStepByStep erhalte ich ziemlich seltsame ergebnise… aber siehe selbst