level 11
唾沫淹死鱼
楼主
#include "SDL2/SDL.h"
#include "SDL2/SDL_opengles2.h"
#include "SDL2/SDL_image.h"
#include<iostream>
#include<fstream>
#include<string>
#include<cstdio>
const int w = 720;
const int h = 1280;
using namespace std;
char* ShaderFileLoader(const char*);
GLuint ProgramLoader(const char**,const int ,const char**,const int );
void ShaderErrorPrinter(GLuint);
void ProgramErrorPrinter(GLuint);
ofstream errorfile("/sdcard/mysdllog.txt");
const char*VertexShaderSource="varying vec4 color;"
"uniform float time;"
"attribute vec4 a_vertex;"
"void main()"
"{"
"color.r = a_vertex.x + tan(time);"
"color.g = a_vertex.y + tan(time);"
"color.b = tan(time);"
"gl_Position = a_vertex+tan(time);"
"}" ;
const char*FragShaderSource="precision mediump float;"
"varying vec4 color;"
"vec4 colorf;"
"void main()"
"{"
"colorf = color;"
"if (color.r < 0.0)"
"colorf.r += color.r;"
"if (color.g < 0.0)"
"colorf.g += color.g;"
"if (color.b < 0.0)"
"colorf.b += color.b;"
"gl_FragColor = colorf;"
"}";
GLuint ProgramLoader(const char**vertexsource,const int sizev,const char**fragsource,const int sizef)
{
GLuint vertex=glCreateShader(GL_VERTEX_SHADER);
GLuint fragment=glCreateShader(GL_FRAGMENT_SHADER);
int vlen,flen;
glShaderSource(vertex,sizev,vertexsource,&vlen);
glShaderSource(fragment,sizef,fragsource,&flen);
glCompileShader(vertex);
int vstatus;
glGetShaderiv(vertex,GL_COMPILE_STATUS,&vstatus);
if(vstatus!=GL_TRUE)
{
errorfile<<"Vertex shader error. shader len : "<<vlen<<endl;
ShaderErrorPrinter(vertex);
glDeleteShader(vertex);
return 0;
}
glCompileShader(fragment);
int fstatus;
glGetShaderiv(fragment,GL_COMPILE_STATUS,&fstatus);
if(fstatus!=GL_TRUE)
{
errorfile<<"Fragment shader error. shader len : "<<flen<<endl;
ShaderErrorPrinter(fragment);
glDeleteShader(fragment);
return 0;
}
GLuint program=glCreateProgram();
glAttachShader(program,vertex);
glAttachShader(program,fragment);
glLinkProgram(program);
GLint pstatus;
glGetProgramiv(program,GL_LINK_STATUS,&pstatus);
if(pstatus!=GL_TRUE)
{
errorfile<<"Program error "<<endl;
ProgramErrorPrinter(program);
glDeleteProgram(program);
return 0;
}
glUseProgram(program);
return program;
}
void ShaderErrorPrinter(GLuint obj)
{
int len;
glGetShaderiv(obj,GL_INFO_LOG_LENGTH,&len);
if(len<1)
{
errorfile<<"Length of Info of Shader Error is < 1"<<endl;
return ;
}
char *infolog=new char[len+1];
glGetShaderInfoLog(obj,len,NULL,infolog);
errorfile<<"this is shader error information:"
<<endl<<"Length of infolog :"<<len
<<endl<<"infolog@start"
<<endl<<infolog
<<endl<<"infolog@end"
<<endl;
delete [] infolog;
}
void ProgramErrorPrinter(GLuint obj)
{
int len;
glGetProgramiv(obj,GL_INFO_LOG_LENGTH,&len);
if(len<1)
{
errorfile<<"Length of Info of Program Error is < 1"<<endl;
return ;
}
char *infolog=new char[len+1];
glGetProgramInfoLog(obj,len,NULL,infolog);
errorfile<<"this is programr error information:"
<<endl<<"Length of infolog :"<<len
<<endl<<"infolog@start"
<<endl<<infolog
<<endl<<"infolog@end"
<<endl;
delete [] infolog;
}
void IsError(void *p)
{
if (p == nullptr)
errorfile << SDL_GetError() << endl;
}
int main()
{
if (-1 == SDL_Init(SDL_INIT_EVERYTHING))
errorfile << SDL_GetError() << endl;
SDL_Window *win = SDL_CreateWindow("Hello", 0, 0, w, h,
SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL);
IsError(win);
SDL_Renderer *ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_PRESENTVSYNC);
IsError(ren);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
SDL_GLContext context = SDL_GL_CreateContext(win);
SDL_GL_SetSwapInterval(1);
glViewport(0,0 ,w,h);
GLuint pro=ProgramLoader(&VertexShaderSource,1,&FragShaderSource,1);
GLint att=glGetAttribLocation(pro,"a_vertex");
GLuint uni=glGetUniformLocation(pro,"time");
glEnableVertexAttribArray(att);
GLfloat vertes[]={
1.0,1.0,1.0,1.0,
-1.0,1.0,1.0,1.0,
-1.0,-1.0,1.0,1.0,
1.0,-1.0,1.0,1.0
};
/*GLfloat vertes[]=
{
-1.0,0.0,1.0,1.0,
1.0,0.0,1.0,1.0
};*/
glVertexAttribPointer(att,4,GL_FLOAT,0,0,vertes);
float time=0.1f;
float timeadder=+0.01f;
while(1)
{
time+=timeadder;
glUniform1f(uni,time);
glDrawArrays(GL_TRIANGLE_FAN,0,4);
if(time>1.0f||time<0.0f)
timeadder=-timeadder;
SDL_GL_SwapWindow(win);
}
SDL_GL_SwapWindow(win);
return 0;
}//
程序本身应该是没有问题的 因为
它能在一个手机上运行另一个手机却不行
能运行的手机gpu是mail-400
不能运行的是adreno320
shader 编译错误 然后错误信息的长度小于1
2014年03月12日 04点03分
1
#include "SDL2/SDL_opengles2.h"
#include "SDL2/SDL_image.h"
#include<iostream>
#include<fstream>
#include<string>
#include<cstdio>
const int w = 720;
const int h = 1280;
using namespace std;
char* ShaderFileLoader(const char*);
GLuint ProgramLoader(const char**,const int ,const char**,const int );
void ShaderErrorPrinter(GLuint);
void ProgramErrorPrinter(GLuint);
ofstream errorfile("/sdcard/mysdllog.txt");
const char*VertexShaderSource="varying vec4 color;"
"uniform float time;"
"attribute vec4 a_vertex;"
"void main()"
"{"
"color.r = a_vertex.x + tan(time);"
"color.g = a_vertex.y + tan(time);"
"color.b = tan(time);"
"gl_Position = a_vertex+tan(time);"
"}" ;
const char*FragShaderSource="precision mediump float;"
"varying vec4 color;"
"vec4 colorf;"
"void main()"
"{"
"colorf = color;"
"if (color.r < 0.0)"
"colorf.r += color.r;"
"if (color.g < 0.0)"
"colorf.g += color.g;"
"if (color.b < 0.0)"
"colorf.b += color.b;"
"gl_FragColor = colorf;"
"}";
GLuint ProgramLoader(const char**vertexsource,const int sizev,const char**fragsource,const int sizef)
{
GLuint vertex=glCreateShader(GL_VERTEX_SHADER);
GLuint fragment=glCreateShader(GL_FRAGMENT_SHADER);
int vlen,flen;
glShaderSource(vertex,sizev,vertexsource,&vlen);
glShaderSource(fragment,sizef,fragsource,&flen);
glCompileShader(vertex);
int vstatus;
glGetShaderiv(vertex,GL_COMPILE_STATUS,&vstatus);
if(vstatus!=GL_TRUE)
{
errorfile<<"Vertex shader error. shader len : "<<vlen<<endl;
ShaderErrorPrinter(vertex);
glDeleteShader(vertex);
return 0;
}
glCompileShader(fragment);
int fstatus;
glGetShaderiv(fragment,GL_COMPILE_STATUS,&fstatus);
if(fstatus!=GL_TRUE)
{
errorfile<<"Fragment shader error. shader len : "<<flen<<endl;
ShaderErrorPrinter(fragment);
glDeleteShader(fragment);
return 0;
}
GLuint program=glCreateProgram();
glAttachShader(program,vertex);
glAttachShader(program,fragment);
glLinkProgram(program);
GLint pstatus;
glGetProgramiv(program,GL_LINK_STATUS,&pstatus);
if(pstatus!=GL_TRUE)
{
errorfile<<"Program error "<<endl;
ProgramErrorPrinter(program);
glDeleteProgram(program);
return 0;
}
glUseProgram(program);
return program;
}
void ShaderErrorPrinter(GLuint obj)
{
int len;
glGetShaderiv(obj,GL_INFO_LOG_LENGTH,&len);
if(len<1)
{
errorfile<<"Length of Info of Shader Error is < 1"<<endl;
return ;
}
char *infolog=new char[len+1];
glGetShaderInfoLog(obj,len,NULL,infolog);
errorfile<<"this is shader error information:"
<<endl<<"Length of infolog :"<<len
<<endl<<"infolog@start"
<<endl<<infolog
<<endl<<"infolog@end"
<<endl;
delete [] infolog;
}
void ProgramErrorPrinter(GLuint obj)
{
int len;
glGetProgramiv(obj,GL_INFO_LOG_LENGTH,&len);
if(len<1)
{
errorfile<<"Length of Info of Program Error is < 1"<<endl;
return ;
}
char *infolog=new char[len+1];
glGetProgramInfoLog(obj,len,NULL,infolog);
errorfile<<"this is programr error information:"
<<endl<<"Length of infolog :"<<len
<<endl<<"infolog@start"
<<endl<<infolog
<<endl<<"infolog@end"
<<endl;
delete [] infolog;
}
void IsError(void *p)
{
if (p == nullptr)
errorfile << SDL_GetError() << endl;
}
int main()
{
if (-1 == SDL_Init(SDL_INIT_EVERYTHING))
errorfile << SDL_GetError() << endl;
SDL_Window *win = SDL_CreateWindow("Hello", 0, 0, w, h,
SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL);
IsError(win);
SDL_Renderer *ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_PRESENTVSYNC);
IsError(ren);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
SDL_GLContext context = SDL_GL_CreateContext(win);
SDL_GL_SetSwapInterval(1);
glViewport(0,0 ,w,h);
GLuint pro=ProgramLoader(&VertexShaderSource,1,&FragShaderSource,1);
GLint att=glGetAttribLocation(pro,"a_vertex");
GLuint uni=glGetUniformLocation(pro,"time");
glEnableVertexAttribArray(att);
GLfloat vertes[]={
1.0,1.0,1.0,1.0,
-1.0,1.0,1.0,1.0,
-1.0,-1.0,1.0,1.0,
1.0,-1.0,1.0,1.0
};
/*GLfloat vertes[]=
{
-1.0,0.0,1.0,1.0,
1.0,0.0,1.0,1.0
};*/
glVertexAttribPointer(att,4,GL_FLOAT,0,0,vertes);
float time=0.1f;
float timeadder=+0.01f;
while(1)
{
time+=timeadder;
glUniform1f(uni,time);
glDrawArrays(GL_TRIANGLE_FAN,0,4);
if(time>1.0f||time<0.0f)
timeadder=-timeadder;
SDL_GL_SwapWindow(win);
}
SDL_GL_SwapWindow(win);
return 0;
}//
程序本身应该是没有问题的 因为
它能在一个手机上运行另一个手机却不行
能运行的手机gpu是mail-400
不能运行的是adreno320
shader 编译错误 然后错误信息的长度小于1
