jjzjj

c++ - OpenGL 纹理的奇怪事件

coder 2024-02-25 原文

我相当确定我的纹理加载没有问题,但是,我无法渲染它们!

我启用 GL_TEXTURE_2D在我初始化 GL 时。然后我用这个函数加载纹理:

GLuint loadTexture(std::string filepath)
{
    SDL_Surface *image;
    if ( image = SDL_LoadBMP( filepath.c_str() ) )
    {
        GLuint tex_id;
        glGenTextures( 1, &tex_id );
        glBindTexture( GL_TEXTURE_2D, tex_id );

        glTexImage2D(   GL_TEXTURE_2D, 0, 3, image->w,
                        image->h, 0, GL_RGB,
                        GL_UNSIGNED_BYTE, image->pixels );

        SDL_FreeSurface(image);

        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );

        textures.emplace(getFilename(filepath), tex_id);

        glBindTexture(GL_TEXTURE_2D, 0);

        return tex_id;
    }
    else
    {
        // std::cout << "[!!] Could not open " << filepath << "! \n";
        return -1;
    }
}

加载纹理,然后将纹理名称放置在以文件名为键的贴图中。该 map 是全局定义为 std::map <std::string, GLuint> textures .我可以遍历 map 并验证 GL 是否正确分配了纹理名称。最后,我继续绘制我的四边形:

glBindTexture(GL_TEXTURE_2D, textures["MY_IMAGE.BMP"]);

glBegin(GL_QUADS);

glTexCoord2f(0.0, 0.0);
glVertex3d(0.0,  0.0, iNode->verticies[1]);

glTexCoord2f(1.0, 0.0);
glVertex3d(1.0,  0.0, iNode->verticies[2]);

glTexCoord2f(1.0, 1.0);
glVertex3d(1.0,  1.0, iNode->verticies[3]);

glTexCoord2f(0.0, 1.0);
glVertex3d(0.0,  1.0, iNode->verticies[4]);

glEnd();

一些值得注意的事情:

  • 这些四边形的颜色在绘制之前就已经定义好了。如果我 注释掉所有格式的颜色定义 glColor3ub(r, g, b) ,四边形呈现黑色。
  • 如果我调用 glIsTexture(textures["MY_IMAGE.BMP"]) ,它返回错误。
  • 纹理名称仍正确存储在 map 中。
  • 我正在使用 OpenGL 2.1。

纹理是否以某种方式在内部被删除?我的渲染有问题吗?

如果需要,我愿意提供更多代码。

编辑: 我不知道我做了什么...... 现在我的渲染看起来像这样:

最佳答案

来自SDL_LoadBMP文档:

Note: When loading a 24-bit Windows BMP file, pixel data points are loaded as blue, green, red, and NOT red, green, blue (as one might expect).

因此提供给glTexImage2D的格式参数需要是GL_BGR

关于c++ - OpenGL 纹理的奇怪事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19011990/

有关c++ - OpenGL 纹理的奇怪事件的更多相关文章

  1. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  2. ruby-on-rails - 事件管理员日期过滤器日期格式自定义 - 2

    是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s

  3. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  4. ruby-on-rails - 事件记录 : Select max of limit - 2

    我正在尝试将以下SQL查询转换为ActiveRecord,它正在融化我的大脑。deletefromtablewhereid有什么想法吗?我想做的是限制表中的行数。所以,我想删除少于最近10个条目的所有内容。编辑:通过结合以下几个答案找到了解决方案。Temperature.where('id这给我留下了最新的10个条目。 最佳答案 从您的SQL来看,您似乎想要从表中删除前10条记录。我相信到目前为止的大多数答案都会如此。这里有两个额外的选择:基于MurifoX的版本:Table.where(:id=>Table.order(:id).

  5. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  6. ruby-on-rails - 事件管理员和自定义方法 - 2

    这是我在ActiveAdmin中的自定义页面ActiveAdmin.register_page"Settings"doaction_itemdolink_to('Importprojects','settings/importprojects')endcontentdopara"Text"endcontrollerdodefimportprojectssystem"rakedataspider:import_projects_ninja"para"OK"endendend我想做的是,当我单击“导入项目”按钮时,我想在Controller中执行rake任务。但是我无法访问该方法。可能是什

  7. arrays - Ruby 数组 += vs 推送 - 2

    我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“

  8. ruby-on-rails - 浮点乘法的 Ruby 奇怪问题 - 2

    有没有人用ruby​​解决这个问题:假设我们有:a=8.1999999我们想将它四舍五入为2位小数,即8.20,然后乘以1,000,000得到8,200,000我们是这样做的;(a.round(2)*1000000).to_i但是我们得到的是8199999,为什么?奇怪的是,如果我们乘以1000、100000或10000000而不是1000000,我们会得到正确的结果。有人知道为什么吗?我们正在使用ruby​​1.9.2并尝试使用1.9.3。谢谢! 最佳答案 每当你在计算中得到时髦的数字时使用bigdecimalrequire'bi

  9. += 的 Ruby 方法 - 2

    有没有办法让Ruby能够做这样的事情?classPlane@moved=0@x=0defx+=(v)#thisiserror@x+=v@moved+=1enddefto_s"moved#{@moved}times,currentxis#{@x}"endendplane=Plane.newplane.x+=5plane.x+=10putsplane.to_s#moved2times,currentxis15 最佳答案 您不能在Ruby中覆盖复合赋值运算符。任务在内部处理。您应该覆盖+,而不是+=。plane.a+=b与plane.a=

  10. ruby-on-rails - 在不重新查询数据库的情况下重新排序 Rails 中的事件记录? - 2

    例如,假设我有一个名为Products的模型,并且在ProductsController中,我有以下代码用于product_listView以显示已排序的产品。@products=Product.order(params[:order_by])让我们想象一下,在product_listView中,用户可以使用下拉菜单按价格、评级、重量等进行排序。数据库中的产品不会经常更改。我很难理解的是,每次用户选择新的order_by过滤器时,rails是否必须查询,或者rails是否能够以某种方式缓存事件记录以在服务器端重新排序?有没有一种方法可以编写它,以便在用户排序时rails不会重新查询结果

随机推荐