2013-10-18 57 views
-2

我已經調試此代碼以盡我所能地創建圓環,並且仍然無法使其運行。我得到的錯誤特別在我的(void init())中。它告訴我,我沒有聲明vPosition和vNormal,但我直接從工作代碼複製/粘貼它,我不明白爲什麼它不起作用。代碼應該產生一個帶陰影的圓環,可以用鼠標旋轉。(progam)未聲明的錯誤

#include "mat.h" 
#include "vec.h" 
#include "Angel.h" 

typedef Angel::vec4 color4; 
typedef Angel::vec4 point4; 

GLuint ModelView, Projection; 
GLuint torus; 

int  click_button; 
GLfloat click_rotation_x; 
GLfloat click_rotation_y; 
GLfloat click_position_z; 
GLfloat click_x; 
GLfloat click_y; 
GLfloat rotation_x = 0.0; 
GLfloat rotation_y = 0.0; 
GLfloat position_z = -5; 

GLuint buffers[1]; 
GLuint loc; 
GLint matrix_loc, projection_loc, color_loc; 


void mouse(int button, int state, int x, int y) 
{ 
    click_x = x; 
    click_y = y; 
    click_rotation_x = rotation_x; 
    click_rotation_y = rotation_y; 
    click_position_z = position_z; 

} 

void motion(int x, int y) 
{ 
    GLfloat dx = GLfloat(x - click_x)/512; 
    GLfloat dy = GLfloat(y - click_y)/512; 

    if (click_button == GLUT_MIDDLE_BUTTON) 
    { 
     rotation_x = click_rotation_x + 90.0 * dy; 
     rotation_y = click_rotation_y + 180.0 * dx; 
     if (rotation_x > 90.0) rotation_x = 90.0; 
     if (rotation_x < -90.0) rotation_x = -90.0; 
     if (rotation_y > 180.0) rotation_y -= 360.0; 
     if (rotation_y < -180.0) rotation_y += 360.0; 
    } 
    else 
    { 
     position_z = click_position_z + 5.0 * dy; 
    } 
    glutPostRedisplay(); 
} 

struct vertex 

{ 
    vec3 v; 
    vec3 n; 
}; 

const int n = 64; 
const int m = 64; 

struct vertex triangles[3*2*n*m]; 

struct vertex torus_vertex(float a, float b) 
{ 
    const float R = 2.0f; 
    const float r = 0.5f; 

    struct vertex vertex; 

    vertex.v.x = (R + r*cos(2.0*M_PI*a))* cos(2.0*M_PI*b); 
    vertex.v.y = (R + r*cos(2.0*M_PI*a))* sin(2.0*M_PI*b); 
    vertex.v.z =  r*sin(2.0*M_PI*a); 

    vertex.n.x =  cos(2.0*M_PI*a)* cos(2.0*M_PI*b); 
    vertex.n.y =  cos(2.0*M_PI*a)* sin(2.0*M_PI*b); 
    vertex.n.z =  sin(2.0*M_PI*a); 

    return vertex; 
} 

GLuint torus_create(GLuint vPosition, GLuint vNormal); 

int i,j,k =0; 


    for (int i=0, i<n, i++) 
     for (int j=0, j<m, j++) 
     { 

      triangles[k++] = torus_vertex(float (i )/n, float (j )/n); 
      triangles[k++] = torus_vertex(float (i + 1)/n, float (j )/n); 
      triangles[k++] = torus_vertex(float (i + 1)/n, float (j + 1)/n); 
      triangles[k++] = torus_vertex(float (i )/n, float (j )/n); 
      triangles[k++] = torus_vertex(float (i + 1)/n, float (j + 1)/n); 
      triangles[k++] = torus_vertex(float (i )/n, float (j + 1)/n); 
     } 



void 
init() 
{  

    GLuint (vbo); 
    glGenBuffers(1, &vbo); 
    glBindBuffer (GL_ARRAY_BUFFER, vbo); 
    glBufferData (GL_ARRAY_BUFFER, sizeof (struct vertex) * k, triangles, GL_STATIC_DRAW); 


    GLuint program = InitShader("vshader53.glsl", "fshader53.glsl"); 
    glUseProgram(program); 

    glEnableVertexAttribArray(vPosition); 
    glEnableVertexAttribArray(vNormal); 

    glVertexAttribPointer(vPosition, 3, GL_FLOAT, GL_FALSE, sizeof (struct vertex), (GLvoid *) 0); 
    glVertexAttribPointer(vNormal, 3, GL_FLOAT, GL_FALSE, sizeof (struct vertex), (GLvoid *) 12); 

    GLuint vPosition = glGetAttribLocation(program, "vPosition"); 
     glEnableVertexAttribArray(vPosition); 
     glVertexAttribPointer(vPosition, 4, GL_FLOAT, GL_FALSE, 0, 
       BUFFER_OFFSET(0)); 

    GLuint vNormal = glGetAttribLocation(program, "vNormal"); 
     glEnableVertexAttribArray(vNormal); 
     glVertexAttribPointer(vNormal, 3, GL_FLOAT, GL_FALSE, 0, 
       BUFFER_OFFSET(sizeof(vertex))); 

    point4 light_position(0.0, 0.0, -1.0, 0.0); 
    color4 light_ambient( 0.2, 0.2, 0.2, 1.0); 
    color4 light_diffuse( 1.0, 1.0, 1.0, 1.0); 
    color4 light_specular( 1.0, 1.0, 1.0, 1.0); 

    color4 material_ambient( 1.0, 0.0, 1.0, 1.0); 
    color4 material_diffuse( 1.0, 0.8, 0.0, 1.0); 
    color4 material_specular(1.0, 0.8, 0.0, 1.0); 
    float material_shininess    = 100.0; 

    color4 ambient_product = light_ambient * material_ambient; 
    color4 diffuse_product = light_diffuse * material_diffuse; 
    color4 specular_product = light_specular * material_specular; 

    glUniform4fv(glGetUniformLocation(program, "AmbientProduct"), 1, ambient_product); 
    glUniform4fv(glGetUniformLocation(program, "DiffuseProduct"), 1, diffuse_product); 
    glUniform4fv(glGetUniformLocation(program, "SpecularProduct"), 1, specular_product); 
    glUniform4fv(glGetUniformLocation(program, "LightPosition" ), 1, light_position); 

    glUniform1f(glGetUniformLocation(program, "Shininess"), material_shininess); 

    ModelView = glGetUniformLocation(program, "ModelView"); 
    Projection = glGetUniformLocation(program, "Projection"); 
} 

int 

main() 
{ 
printf("%d %d %d\n", n, m, k); 
glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH); 
glutInitWindowSize(512, 512); 
glutCreateWindow("Torus"); 
glutMouseFunc(mouse); 
glutMotionFunc(motion); 

glEnable(GL_DEPTH_TEST); 
glutMainLoop(); 
return 0; 
} 
+2

修復此帖子的標題。它並沒有解釋你所遇到的錯誤,因此你不會找到任何人提供幫助。 –

回答

1

看起來你在定義它們之前使用了變量。將以下內容從init()函數中間移到init()函數的頂部:

GLuint vPosition = glGetAttribLocation(program, "vPosition"); 
    glEnableVertexAttribArray(vPosition); 
    glVertexAttribPointer(vPosition, 4, GL_FLOAT, GL_FALSE, 0, 
      BUFFER_OFFSET(0)); 

GLuint vNormal = glGetAttribLocation(program, "vNormal"); 
    glEnableVertexAttribArray(vNormal); 
    glVertexAttribPointer(vNormal, 3, GL_FLOAT, GL_FALSE, 0, 
      BUFFER_OFFSET(sizeof(vertex)));