Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.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
Opengl 生成纹理的问题_Opengl_Textures_Framebuffer - Fatal编程技术网

Opengl 生成纹理的问题

Opengl 生成纹理的问题,opengl,textures,framebuffer,Opengl,Textures,Framebuffer,更新2工程,这是一个错误的allert 更新2(使用vbo顶点和片段着色器),但仍然不起作用 #include "GL/glxew.h" #include "GL/glext.h" #include "GL/glu.h" #include "GL/freeglut.h" #include <iostream> GLint attribute; GLuint program; void gen_texture(GLuint &texture, int width, int

更新2工程,这是一个错误的allert

更新2(使用vbo顶点和片段着色器),但仍然不起作用

#include "GL/glxew.h"
#include "GL/glext.h"
#include "GL/glu.h"
#include "GL/freeglut.h"

#include <iostream>

GLint attribute;
GLuint program;

void gen_texture(GLuint &texture, int width, int height)
{
   GLuint fb;

   glGenFramebuffers(1, &fb);
   glGenTextures(1, &texture);

   glBindFramebuffer(GL_FRAMEBUFFER, fb);

   glBindTexture(GL_TEXTURE_2D, texture);
   glTexImage2D(GL_TEXTURE_2D, 
                0,
                GL_RGBA,
                width, height,
                0,
                GL_RGBA,
                GL_UNSIGNED_BYTE,
                0);

   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
   glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);

   glBindTexture(GL_TEXTURE_2D, 0);
   glEnable(GL_TEXTURE_2D);
   glBindFramebuffer(GL_FRAMEBUFFER, fb);

   glClearColor(1,1,1,0);
   glClear(GL_COLOR_BUFFER_BIT);

   glUseProgram(program);
   glEnableVertexAttribArray(attribute);
   GLfloat vertex_data[]
   {
      1.0f, 0.0f,
      0.0f, 0.0f,
      0.0f, 1.0f,

      1.0f, 0.0f,
      0.0f, 1.0f,
      1.0f, 1.0f
   };

   glVertexAttribPointer(
      attribute,
      2,
      GL_FLOAT,
      GL_FALSE,
      0,
      vertex_data
   );

   glDrawArrays(GL_TRIANGLES, 0, 6);
   glDisableVertexAttribArray(attribute);
}

void init_layout()
{
   GLint compile_ok = GL_FALSE, link_ok = GL_FALSE;

   GLuint vs, fs;

   vs = glCreateShader(GL_VERTEX_SHADER);
   const char *vs_source =
   "#version 120\n"  // OpenGL 2.1
   "attribute vec2 coord2d;                  "
   "void main(void) {                        "
   "  gl_Position = vec4(coord2d, 0.0, 1.0); "
   "}";
   glShaderSource(vs, 1, &vs_source, 0);
   glCompileShader(vs);
   glGetShaderiv(vs, GL_COMPILE_STATUS, &compile_ok);
   if (0 == compile_ok)
   {
      std::cerr << "[texture_layout/init_layout] fehler im vertex shader\n";
      exit(1);
   }

   fs = glCreateShader(GL_FRAGMENT_SHADER);
   const char *fs_source =
   "#version 120\n"   // OpenGL 2.1
   "void main(void) {        "
   "  gl_FragColor[0] = 0.8f; "
   "  gl_FragColor[1] = 0.5f;"
   "  gl_FragColor[2] = 0.0f; "
   "}";
   glShaderSource(fs, 1, &fs_source, 0);
   glCompileShader(fs);
   glGetShaderiv(fs, GL_COMPILE_STATUS, &compile_ok);
   if (0 == compile_ok)
   {
      std::cerr << "[texture_layout/init_layout] fehler im fragment shader\n";
      exit(1);
   }

   program = glCreateProgram();
   glAttachShader(program, vs);
   glAttachShader(program, fs);
   glLinkProgram(program);
   glGetProgramiv(program, GL_LINK_STATUS, &link_ok);
   if (!link_ok)
   {
      std::cerr << "[texture_layout/init_layout] fehler in glLinkProgram\n";
      exit(1);
   }

   const char* attribute_name = "coord2d";
   attribute = glGetAttribLocation(program, attribute_name);
   if (attribute == -1) {
      std::cerr << "Could not bind attribute " << attribute_name << "\n";
      exit(1);
   }
}


int main(int argc, char **argv)
{
   glutInit (&argc, argv);
   glutInitContextProfile(GLUT_CORE_PROFILE); 

   glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA);
   glutInitWindowSize (500, 500);
   glutCreateWindow ("");

   glewExperimental=GL_TRUE;
   GLenum err=glewInit();
   if(err!=0)
   {
      std::cerr << glewGetErrorString(err) << std::endl;
      exit(1);
   }

   GLenum error;

   GLuint texture;

   while ( ( error = glGetError() ) != GL_NO_ERROR)
   {
      std::cerr << std::hex << error << "\n";
   }
   init_layout();
   gen_texture(texture, 200, 200);

   GLvoid *tex_data = new GLubyte[4*200*200];

   glBindTexture(GL_TEXTURE_2D, texture);
   glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, tex_data);


   return 0;
}
原件2:

我有一个函数,它应该使用glBegin指令在纹理中绘制一个红方块。但我唯一要做的就是

glClearColor(0, 0, 0, 0);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
我已经用多种颜色测试过了。但这一部分不起作用:

glMatrixMode(GL_PROJECTION);
glLoadIdentity;
glViewport(0,0,width,height);
glOrtho(0,width,0,height,0,128);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glDisable(GL_DEPTH_TEST);

glColor3f(1.f, .0f, .0f);   
glBegin(GL_QUADS);
  glVertex2f(0, 0);
  glVertex2f(0, height);
  glVertex2f(width, height);
  glVertex2f(width, 0);
glEnd();
以下是完整的功能:

void gen_texture(GLuint &color, int width, int height)
{
   GLuint fb;

   glGenFramebuffers(1, &fb);
   glGenTextures(1, &color);

   glBindFramebuffer(GL_FRAMEBUFFER, fb);

   glBindTexture(GL_TEXTURE_2D, color);
   glTexImage2D(GL_TEXTURE_2D,
      0,
      GL_RGBA,
      width, height,
      0,
      GL_RGBA,
      GL_UNSIGNED_BYTE,
      0);

   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
   glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color, 0);

   glBindTexture(GL_TEXTURE_2D, 0);
   glEnable(GL_TEXTURE_2D);
   glBindFramebuffer(GL_FRAMEBUFFER, fb);

   glMatrixMode(GL_PROJECTION);
   glLoadIdentity;
   glViewport(0,0,width,height);
   glOrtho(0,width,0,height,0,128);

   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();


   glClearColor(0, 0, 0, 0);
   glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

   glDisable(GL_DEPTH_TEST);
   //glDisable(GL_CULL_FACE);

   glColor3f(1.f, .0f, .0f);   
   glBegin(GL_QUADS);
      glVertex2f(0, 0);
      glVertex2f(0, height);
      glVertex2f(width, height);
      glVertex2f(width, 0);
   glEnd();
}
原职:

我有一个函数,它应该在纹理中绘制一个红方块,但是当我调用生成纹理的函数,然后我想检查生成的纹理数据时,使用glGetTexImage函数,我得到一个空指针

#include "GL/glxew.h"
#include "GL/glext.h"
#include "GL/glu.h"
#include "GL/freeglut.h"

#include <iostream>

GLuint texture;
GLvoid *tex_data;


void gen_texture(GLuint &color, int width, int height)
{
   GLuint fb;

   glGenFramebuffers(1, &fb);
   glGenTextures(1, &color);

   glBindFramebuffer(GL_FRAMEBUFFER, fb);

   glTexImage2D(GL_TEXTURE_2D,
      0,
      GL_RGBA,
      width, height,
      0,
      GL_RGBA,
      GL_UNSIGNED_BYTE,
      0);

   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
   glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color, 0);

   glBindTexture(GL_TEXTURE_2D, 0);
   glEnable(GL_TEXTURE_2D);
   glBindFramebuffer(GL_FRAMEBUFFER, fb);

   glViewport(0, 0, width, height);

   glClearColor(1,1,1,0);
   glClear(GL_COLOR_BUFFER_BIT);

   glMatrixMode (GL_PROJECTION);

   glLoadIdentity ();

   glOrtho (0, width, height, 0, 0, 1);

   glMatrixMode (GL_MODELVIEW);

   glDisable(GL_DEPTH_TEST);
   glDisable(GL_CULL_FACE);

   glColor4f(1.f, .0f, .0f, .5f);   
   glBegin(GL_QUADS);
      glVertex2f(0, 0);
      glVertex2f(0, height);
      glVertex2f(width, height);
      glVertex2f(width, 0);
   glEnd();
}

int main(int argc, char **argv)
{
   glutInit (&argc, argv);
   glutInitContextVersion(3, 2);
   glutInitContextProfile(GLUT_CORE_PROFILE); 

   glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA);
   glutInitWindowSize (500, 500);
   glutCreateWindow ("");

   glewExperimental=GL_TRUE;
   GLenum err=glewInit();
   if(err!=0)
   {
      std::cerr << glewGetErrorString(err) << std::endl;
      exit(1);
   }

   GLenum error;

   while ( ( error = glGetError() ) != GL_NO_ERROR)
   {
      std::cerr << std::hex << error << "\n";
   }

   gen_texture(texture, 200, 200);

   glBindTexture(GL_TEXTURE_2D, texture);

   glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, tex_data);

   if (tex_data == 0)
      std::cerr << "Captain, eine Null an Board!\n";

   return 0;
}
#包括“GL/glxew.h”
#包括“GL/glext.h”
#包括“GL/glu.h”
#包括“GL/freeglut.h”
#包括
胶合结构;
GLvoid*tex_数据;
void gen_纹理(胶合和颜色、胶合宽度、胶合高度)
{
GLuint fb;
glGenFramebuffers(1和fb);
glGenTextures(1,彩色);
glBindFramebuffer(GL_FRAMEBUFFER,fb);
glTexImage2D(GL_纹理_2D,
0,
格尔巴,
宽度,高度,
0,
格尔巴,
GL_无符号字节,
0);
glTexParameteri(GL_纹理2D、GL_纹理最小过滤器、GL_线性);
glTexParameteri(GL_纹理2D、GL_纹理MAG_过滤器、GL_线性);
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,GL_TEXTURE_2D,COLOR,0);
glBindTexture(GL_TEXTURE_2D,0);
glEnable(GL_纹理_2D);
glBindFramebuffer(GL_FRAMEBUFFER,fb);
glViewport(0,0,宽度,高度);
glClearColor(1,1,1,0);
glClear(GLU颜色缓冲位);
glMatrixMode(GL_投影);
glLoadIdentity();
格洛托(0,宽度,高度,0,0,1);
glMatrixMode(GLU模型视图);
glDisable(GLU深度测试);
glDisable(GLU消隐面);
glColor4f(1.f、.0f、.0f、.5f);
glBegin(GL_QUADS);
glVertex2f(0,0);
glVertex2f(0,高度);
glVertex2f(宽度、高度);
glVertex2f(宽度,0);
格伦德();
}
int main(int argc,字符**argv)
{
glutInit(&argc,argv);
glutInitContextVersion(3,2);
glutInitContextProfile(GLUT_核心_配置文件);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowSize(500500);
创建窗口(“”);
glewExperimental=GL_TRUE;
GLenum err=glewInit();
如果(错误!=0)
{
标准:cerr
glBegin()
和好友在核心上下文中不是有效的调用


如果你坚持核心,你就必须在着色器和VBO上进行旋转。

你真的填充了纹理数据吗,因为你将纹理变量传递给gen_textures()。这是一个打字错误吗?@Full Front Nuduce I填充了纹理数据,以便能够在调试器中检查纹理,并有一个指针寻址纹理数据。在gen_texture()中应该生成纹理。哦,在调用glTexImage2d之前,我忘了调用glBindTexture,我看到我必须自己为纹理数据分配内存。但是现在我有一个问题,glBegin和glEnd之间的绘图指令似乎对纹理没有影响。我更改了代码,但它不起作用,我想k我使用vbo的方式不对。(请参阅编辑的问题帖子)我没有看到您设置任何着色器。Core中没有任何“默认”着色器。而且您仍然有固定的函数颜色和矩阵调用。
#include "GL/glxew.h"
#include "GL/glext.h"
#include "GL/glu.h"
#include "GL/freeglut.h"

#include <iostream>

GLuint texture;
GLvoid *tex_data;


void gen_texture(GLuint &color, int width, int height)
{
   GLuint fb;

   glGenFramebuffers(1, &fb);
   glGenTextures(1, &color);

   glBindFramebuffer(GL_FRAMEBUFFER, fb);

   glTexImage2D(GL_TEXTURE_2D,
      0,
      GL_RGBA,
      width, height,
      0,
      GL_RGBA,
      GL_UNSIGNED_BYTE,
      0);

   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
   glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color, 0);

   glBindTexture(GL_TEXTURE_2D, 0);
   glEnable(GL_TEXTURE_2D);
   glBindFramebuffer(GL_FRAMEBUFFER, fb);

   glViewport(0, 0, width, height);

   glClearColor(1,1,1,0);
   glClear(GL_COLOR_BUFFER_BIT);

   glMatrixMode (GL_PROJECTION);

   glLoadIdentity ();

   glOrtho (0, width, height, 0, 0, 1);

   glMatrixMode (GL_MODELVIEW);

   glDisable(GL_DEPTH_TEST);
   glDisable(GL_CULL_FACE);

   glColor4f(1.f, .0f, .0f, .5f);   
   glBegin(GL_QUADS);
      glVertex2f(0, 0);
      glVertex2f(0, height);
      glVertex2f(width, height);
      glVertex2f(width, 0);
   glEnd();
}

int main(int argc, char **argv)
{
   glutInit (&argc, argv);
   glutInitContextVersion(3, 2);
   glutInitContextProfile(GLUT_CORE_PROFILE); 

   glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA);
   glutInitWindowSize (500, 500);
   glutCreateWindow ("");

   glewExperimental=GL_TRUE;
   GLenum err=glewInit();
   if(err!=0)
   {
      std::cerr << glewGetErrorString(err) << std::endl;
      exit(1);
   }

   GLenum error;

   while ( ( error = glGetError() ) != GL_NO_ERROR)
   {
      std::cerr << std::hex << error << "\n";
   }

   gen_texture(texture, 200, 200);

   glBindTexture(GL_TEXTURE_2D, texture);

   glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, tex_data);

   if (tex_data == 0)
      std::cerr << "Captain, eine Null an Board!\n";

   return 0;
}
glutInitContextVersion(3, 2);
glutInitContextProfile(GLUT_CORE_PROFILE);
                       ^^^^^^^^^^^^^^^^^ ok...
....
glBegin(GL_QUADS);
        ^^^^^^^^ wat