2017-03-30 25 views
0

我有片段和顶点,并且我无法在java代码中调用编译三角形,每个顶点定义一种颜色。如何修改算法以返回具有不同顶点颜色的三角形

package Projeto_2; 

import com.jogamp.opengl.*; 
import com.jogamp.newt.opengl.GLWindow; 
import com.jogamp.opengl.util.Animator; 

import java.io.BufferedReader; 
import java.io.FileReader; 

/** 
* JSingleTriangle.java <BR> 
* 
* 
* Java implementation of example (listing 2.8 and 2.9) of the OpenGL SuperBible 6th Edition. 
* Not exactly the same but an adaptation. 
*/ 

public final class Projeto_2 implements GLEventListener { 

private GL4 gl; 

private static int width=600; 
private static int height=600; 



private int shaderProgram; 
private int vertShader; 
private int fragShader; 

private int[] vao; 



public static void main(String[] s) { 

    // This demo is based on the GL4 GLProfile 
    GLCapabilities caps = new GLCapabilities(GLProfile.get(GLProfile.GL4)); 

    // The demo uses the NEWT (Native Windowing Toolkit) Programming Library 
    GLWindow glWindow = GLWindow.create(caps); 

    // Setup the GLWindow 
    glWindow.setTitle("Single Triangle - JOGL"); 
    glWindow.setSize(width,height); 
    glWindow.setUndecorated(false); 
    glWindow.setPointerVisible(true); 
    glWindow.setVisible(true); 

    // Finally we connect the GLEventListener application code to the GLWindow. 
    // GLWindow will call the GLEventListener init, reshape, display and dispose functions when needed. 
    glWindow.addGLEventListener(new Projeto_2()); 
    Animator animator = new Animator(); 
    animator.add(glWindow); 
    animator.start(); 
} 

public void init(GLAutoDrawable drawable) { 
    System.out.println("init"); 

    gl = drawable.getGL().getGL4(); 

    // Create GPU shader handles 
    vertShader = loadShader(GL4.GL_VERTEX_SHADER, "./src/shader.vert"); 
    fragShader = loadShader(GL4.GL_FRAGMENT_SHADER, "./src/shader.frag"); 
    //Each shaderProgram must have one vertex shader and one fragment shader. 
    shaderProgram = gl.glCreateProgram(); 
    gl.glAttachShader(shaderProgram, vertShader); 
    gl.glAttachShader(shaderProgram, fragShader);  

    //gl.glBindAttribLocation(shaderProgram, 0, "attribute_Position"); ///////////////////////////// 
    // gl.glBindAttribLocation(shaderProgram, 1, "attribute_Color"); //////////////////////////// 

    gl.glLinkProgram(shaderProgram); 
    // Check link status. 
    int[] linked = new int[1]; 
    gl.glGetProgramiv(shaderProgram, GL4.GL_LINK_STATUS, linked, 0); 
    if(linked[0]!=0){System.out.println("Shaders succesfully linked");} 
    else { 
     int[] logLength = new int[1]; 
     gl.glGetProgramiv(shaderProgram, GL4.GL_INFO_LOG_LENGTH, logLength, 0); 

     byte[] log = new byte[logLength[0]]; 
     gl.glGetProgramInfoLog(shaderProgram, logLength[0], (int[])null, 0, log, 0); 

     System.err.println("Error linking shaders: " + new String(log)); 
     System.exit(1); 
    } 

    gl.glUseProgram(shaderProgram); 

    vao = new int[1]; 
    gl.glGenVertexArrays(1, vao, 0); 
    gl.glBindVertexArray(vao[0]); 


}; 

public void reshape(GLAutoDrawable drawable, int x, int y, int z, int h) { 
    System.out.println("reshape - Window resized to width=" + z + " height=" + h); 
    width = z; 
    height = h; 

    // Optional: Set viewport 
    // Render to a square at the center of the window. 
    gl.glViewport((width-height)/2, 0, height, height); 
} 

public void display(GLAutoDrawable drawable) { 
    float[] bg = {0.0f, 0.0f, 0.0f, 1.0f}; 
    gl.glClearBufferfv(GL4.GL_COLOR, 0, bg, 0); 

    gl.glDrawArrays(GL4.GL_TRIANGLES, 0, 3); 
} 

public void dispose(GLAutoDrawable drawable) { 
    System.out.println("Dispose"); 
    System.out.println("cleanup, remember to release shaders"); 
    gl.glUseProgram(0); 
    gl.glDetachShader(shaderProgram, vertShader); 
    gl.glDeleteShader(vertShader); 
    gl.glDetachShader(shaderProgram, fragShader); 
    gl.glDeleteShader(fragShader); 
    gl.glDeleteProgram(shaderProgram); 
    System.exit(0); 
    System.exit(0); 
} 

public int loadShader(int type, String filename) { 
    int shader; 

    // Create GPU shader handle 
    shader = gl.glCreateShader(type); 

    // Read shader file 
    String[] vlines = new String[1]; 
    vlines[0] = ""; 
    String line; 

    try{ 
     BufferedReader reader = new BufferedReader(new FileReader(filename)); 
     while((line = reader.readLine()) != null) { 
      vlines[0] += line + "\n"; // insert a newline character after each line 
     } 
     reader.close(); 
    } catch (Exception e) { 
     System.err.println("Fail reading shader file"); 
    } 

    gl.glShaderSource(shader, vlines.length, vlines, null); 

    // Compile shader 
    gl.glCompileShader(shader); 

    // Check compile status. 
    int[] compiled = new int[1]; 
    gl.glGetShaderiv(shader, GL4.GL_COMPILE_STATUS, compiled, 0); 
    if(compiled[0]!=0){System.out.println("Shader succesfully compiled");} 
    else { 
     int[] logLength = new int[1]; 
     gl.glGetShaderiv(shader, GL4.GL_INFO_LOG_LENGTH, logLength, 0); 

     byte[] log = new byte[logLength[0]]; 
     gl.glGetShaderInfoLog(shader, logLength[0], (int[])null, 0, log, 0); 

     System.err.println("Error compiling the shader: " + new String(log)); 
     System.exit(1); 
    } 

    return shader; 
} 

我不知道什么函数来调用这两个着色器,生成该三角形的三个顶点和每个顶点定义颜色有红色,蓝色和绿色。

Shader.frag

#version 400 core 

in vec4 varying_Color; // incoming varying data to the 
        // fragment shader 
        // sent from the vertex shader 

void main (void) { 
gl_FragColor = varying_Color; 
} 

shader.vert

#version 400 core 

in vec4 attribute_Position; // vertex shader 
in vec4 attribute_Color; // attributes 

out vec4 varying_Color; // Outgoing varying data 
        // sent to the fragment shader 
void main (void) { 
varying_Color = attribute_Color; 
gl_Position = attribute_Position; 
} 
+1

'Java的== javascript' –

+1

'Java的== javascript' – shmosel

+0

的Java @JaromandaX – wgrt

回答

1

我不使用JAVA也不JOGL要么所以我可能是错的,但我的OpenGL的经验告诉我,你的顶点着色器对我来说看起来不太合适,特别是这个:

#version 400 core 
in vec4 attribute_Position; // vertex shader 
in vec4 attribute_Color; // attributes 

您选择了GL 4.00核心配置文件并使用in作为输入。如果你输入从着色器上方的顶点提供的工作,但我认为不是这样的(因为你只拿到了顶点和片段),所以你应该有这样的事情,而不是:

#version 400 core 
layout(location=0) in vec4 attribute_Position; 
layout(location=1) in vec4 attribute_Color; 

你也应该绑定位置和颜色VBO到这些位置,以便unrem在代码中你

gl.glBindAttribLocation(shaderProgram, 0, "attribute_Position"); 
gl.glBindAttribLocation(shaderProgram, 1, "attribute_Color"); 

绑定,但我不熟悉,我更习惯这样的:

// bind VBO 
glBindBuffer(vbotype,vboid); 
glEnableVertexAttribArray(vbolocation); 
glVertexAttribPointer(vbolocation,datacomponents,datatype,GL_FALSE,0,0); 

// unbind VBO 
glBindBuffer(vbotype,0); 
glDisableVertexAttribArray(vbolocation); 

如果每个VBO有以下:!

GLuint vboid;      // OpenGL id for current VBO 
int vbolocation;     // intended VBO atrib layout location for GLSL 
GLuint vbotype;      // GL_ARRAY_BUFFER,GL_ELEMENT_ARRAY_BUFFER 
GLuint datatype;     // GL_FLOAT,GL_UNSIGNED_INT 
GLuint datacomponents;    // vector size 1,2,3,4 
List<GLint> data;     // 32bit vbo data (always overtype with datatype on any access!!!) 
+1

中讨论过了'布局(位置...'或者'glBindAttribLocation'是等价的,做这两件事中的一件应该足够了,我完全同意第二部分:程序从来没有告诉OpenGL绘制什么,所以没有任何东西被绘制并不令人惊讶。 – BDL

相关问题