glGetUniformLocation为什么返回-1

ibmc490365333 2015-11-01 09:46:38
SDL2+OpenGL ES2编程,Linux4.2.5,mesa11.0.4,Intel集成显卡,gdb调试发现glGetUniformLocation返回-1,窗口黑屏,怎么办?如果直接删掉uniform变量相关的代码就能正常显示三角形,GLSL代码是不是写错了?
我正在学着用OpenGL ES

#include <SDL2/SDL.h>
#include <GLES2/gl2.h>
#include <stdio.h>

void changemvp(GLfloat mvp[16]);

int main(int argc, char **argv){
SDL_Init(SDL_INIT_VIDEO);

SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);

SDL_DisplayMode dm;
SDL_GetDesktopDisplayMode(0, &dm);

SDL_Window *win = SDL_CreateWindow("Hello", 0, 0, dm.w, dm.h, SDL_WINDOW_OPENGL);
SDL_GLContext glc = SDL_GL_CreateContext(win);

const GLchar * vShaderStr =
"attribute vec4 vPosition;"
"attribute vec4 vColor;"
"uniform mat4 mvp"
"varying vec4 v_color;"
"void main() "
"{ "
" gl_Position = mvp * vPosition;"
" v_color = vColor;"
"}";

const GLchar * fShaderStr =
"precision mediump float;"
"varying vec4 v_color;"
"void main()"
"{"
" gl_FragColor = v_color;"
"}";

GLuint vertexShader;
GLuint fragmentShader;
GLuint programObject;

vertexShader = glCreateShader(GL_VERTEX_SHADER);
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);

glShaderSource(vertexShader, 1, &vShaderStr, NULL);
glShaderSource(fragmentShader, 1, &fShaderStr, NULL);
glCompileShader(vertexShader);
glCompileShader(fragmentShader);

programObject = glCreateProgram ( );

glAttachShader ( programObject, vertexShader );
glAttachShader ( programObject, fragmentShader );

glLinkProgram ( programObject );
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);

glUseProgram(programObject);

glClearColor ( 0.0f, 0.0f, 0.0f, 0.0f );
glClear(GL_COLOR_BUFFER_BIT);
glViewport(0,0,dm.w,dm.h);


GLfloat vVertices[] = { 0.0f, 0.5f, 0.0f, 0.67f, 0.4f, 0.47f,
-1.0f, -0.5f, 0.0f, 1.0f, 0.4f, 0.97f,
0.5f, -0.5f, 0.0f, 0.0f, 0.4f, 0.57f
};
#define stride 6
#define vPosition_offset 0
#define vPosition_size 3
#define vColor_offset 3
#define vPosition_size 3

GLfloat mvp[16]={1,0,0,0,
0,1,0,0,
0,0,1,0,
0,0,0,1
};
glBindAttribLocation ( programObject, 0, "vPosition" );
glBindAttribLocation ( programObject, 1, "vColor" );
glVertexAttribPointer ( 0, vPosition_size, GL_FLOAT, GL_FALSE, stride*sizeof(float), vVertices+vPosition_offset );
glVertexAttribPointer ( 1, vPosition_size, GL_FLOAT, GL_FALSE, stride*sizeof(float), vVertices+vColor_offset );
int mvploc = glGetUniformLocation(programObject, "mvp");
glUniformMatrix4fv(mvploc, 1, GL_FALSE, mvp);
glEnableVertexAttribArray ( 0 );
glEnableVertexAttribArray ( 1 );
glDrawArrays(GL_TRIANGLES, 0, 3);
SDL_GL_SwapWindow(win);


SDL_Event e;
while(1){
int r = SDL_PollEvent(&e);
if(!r)continue;
if(e.type == SDL_KEYDOWN)goto quit;
if(e.type == SDL_MOUSEMOTION){
changemvp(mvp);
}
}

quit:
SDL_GL_DeleteContext(glc);
SDL_DestroyWindow(win);
SDL_Quit();
}

void changemvp(GLfloat mvp[16]){
}
...全文
989 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
池龙飞天 2017-10-27
  • 打赏
  • 举报
回复
如果你声明的变量没有被用到,那么glGetUniformLocation返回值永远是-1

456

社区成员

发帖
与我相关
我的任务
社区描述
其它游戏引擎
社区管理员
  • 其它游戏引擎社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧