Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在Opengl中为加载的OBJ模型制作着色器_C++_Opengl_Shader - Fatal编程技术网

C++ 在Opengl中为加载的OBJ模型制作着色器

C++ 在Opengl中为加载的OBJ模型制作着色器,c++,opengl,shader,C++,Opengl,Shader,我已使用以下内容加载了对象(.obj)模型: void Model::loadOBJ(常量字符*路径,std::vector和out_顶点,std::vector和out_UV,std::vector和out_法线){ std::向量顶点指数、UV指数、法线指数; std::向量temp_顶点; 标准:向量温度; 标准::向量温度法向量; FILE*FILE=fopen(路径“r”); if(file==NULL) 回来 而(1){ 字符行标头[128]; int res=fscanf(文件“%

我已使用以下内容加载了对象(.obj)模型:

void Model::loadOBJ(常量字符*路径,std::vector和out_顶点,std::vector和out_UV,std::vector和out_法线){
std::向量顶点指数、UV指数、法线指数;
std::向量temp_顶点;
标准:向量温度;
标准::向量温度法向量;
FILE*FILE=fopen(路径“r”);
if(file==NULL)
回来
而(1){
字符行标头[128];
int res=fscanf(文件“%s”,行头);
如果(res==EOF)
打破
if(strcmp(行首,“v”)==0){
向量3顶点;
fscanf(文件“%f%f%f\n”、&vertex.x、&vertex.y和&vertex.z);
临时顶点。向后推(顶点);
}否则如果(strcmp(行首,“vt”)==0){
矢量2紫外线;
fscanf(文件“%f%f\n”、&uv.x和&uv.y);
温度uv推回(uv);
}else if(strcmp(行首,“f”)==0){
std::字符串vertex1、vertex2、vertex3;
无符号整数顶点索引[3]、uvIndex[3]、normalIndex[3];
int matches=fscanf(文件,“%d/%d/%d%d/%d/%d/%d/%d/%d/%d\n”、&vertexIndex[0]、&uvIndex[0]、&normalIndex[0]、&vertexIndex[1]、&uvIndex[1]、&normalIndex[1]、&vertexIndex[2]、&uvIndex[2]);
如果(匹配!=9){
退出(比赛);
返回;}
顶点索引。向后推(顶点索引[0]);
顶点索引。向后推(顶点索引[1]);
顶点索引。向后推(顶点索引[2]);
uvIndex.push_back(uvIndex[0]);
uvIndex.push_back(uvIndex[1]);
uvIndex.push_back(uvIndex[2]);
normalIndex.push_back(normalIndex[0]);
normalIndex.push_back(normalIndex[1]);
normalIndex.push_back(normalIndex[2]);
}
}   
for(无符号整数i=0;i
我用手指画它

void Model::draw()
{   
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture);
glBegin(GL_TRIANGLES);
glPushMatrix();
glLoadIdentity();
glClearColor(0.0, 0.0, 0.0, 0.0);
glColor3f(1, 1, 1);
for (int l_index = 0; l_index < vertices.size(); l_index++)
{
    glTexCoord2f(uvs[l_index].x, uvs[l_index].y);
    glVertex3f(vertices[l_index].x * 5, vertices[l_index].y * 5, vertices[l_index].z * 5);
}
glDisable(GL_TEXTURE_2D);
glEnd();
}
void模型::draw()
{   
glEnable(GL_纹理_2D);
glBindTexture(GL_TEXTURE_2D,纹理);
glBegin(GL_三角形);
glPushMatrix();
glLoadIdentity();
glClearColor(0.0,0.0,0.0,0.0);
gl3f(1,1,1);
对于(int l_index=0;l_index
模型将正确加载并保存.obj文件中的法线、UV和顶点


我该如何制作一个着色器呢?

您需要阅读一些关于GLSL基础知识的教程。由于模型包含xyz位置、uv纹理坐标和xyz法线,因此这些将是顶点着色器的输入。顶点着色器将使用世界/视图/投影矩阵将顶点转换为剪辑空间,将纹理坐标传递给像素着色器,像素着色器将从纹理贴图查找颜色

void Model::draw()
{   
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture);
glBegin(GL_TRIANGLES);
glPushMatrix();
glLoadIdentity();
glClearColor(0.0, 0.0, 0.0, 0.0);
glColor3f(1, 1, 1);
for (int l_index = 0; l_index < vertices.size(); l_index++)
{
    glTexCoord2f(uvs[l_index].x, uvs[l_index].y);
    glVertex3f(vertices[l_index].x * 5, vertices[l_index].y * 5, vertices[l_index].z * 5);
}
glDisable(GL_TEXTURE_2D);
glEnd();
}