<div style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial"><div>Hi, </div><div>    I checked again about the function "State::<span style="font-family: arial; white-space: pre-wrap;">setActiveTextureUnit()", and it seems like it's designed to be called inside the class "</span>State" but not for users's calling. </div><div>   So to enable the GL_TEXTURE_2D mode, and to make a specified unit to be the current, you can use</div><div>    >state->applyTextureMode(0, GL_TEXTURE_2D, true);     //this will call State::<span style="font-family: arial; white-space: pre-wrap;">setActiveTextureUnit(0) internally.</span></div><div><br></div><div>   and to bind a texture object to target GL_TEXTURE_2D, call</div><div>    >state->applyTextureAttribute(0, texture[0]);                       //<span style="font-family: arial; white-space: pre-wrap;">texture[0]->apply(*state) should work too</span></div><div><br></div><div>    Sorry for misleading you. </div><div>    Function "State::<span style="font-family: arial; white-space: pre-wrap;">setActiveTextureUnit()" only </span>makes a specified unit to be the current, without enabling GL_TEXTURE_2D mode.</div><div><br></div><div>    As I understand, in the function drawImplementation(), you can even call native gl*() funtions(like glEnable(GL_TEXTURE_2D), glBindTexture(...)). Just remember to restore the gl state you have changed when leaving the funtion. But do not worry about this too much, as OSG's state manager will minimize the affect¡ª¡ªwhen rendering other drawables, OSG will make states to be as you have pre-settled on them, while those you have not settled somehow will be unsure since you are not using OSG's state system.</div><br><div style="position:relative;zoom:1">--<br><div><br></div><div><br></div><div>Cheers, </div><div>---</div><div>TianZJ</div><div style="clear:both"></div></div><div id="divNeteaseMailCard"></div><br><pre><br>At 2016-12-29 21:34:40, "Aaron Andersen" <aaron@fosslib.net> wrote:
>Hello TanZJ,
>
>Thank you for the information. I don't think I quite understood your  
>intention though. I apologize if this is obvious but as I said my  
>OpenGL skills are lacking... Here is my code after applying your  
>suggestion about applying the texture to the state:
>
>class MyDrawable {
>osg::ref_ptr<osg::Texture2D> texture[3];
>public:
>     MyDrawable()
>     {
>         for (int i : {0, 1, 2})
>         {
>             const std::string filename = std::to_string(i + 1) + ".png";
>
>             if (osg::Image * image = osgDB::readImageFile(filename))
>             {
>                 texture[i] = new osg::Texture2D;
>                 texture[i]->setImage(image);
>             }
>             else
>             {
>                 std::cerr << "ERROR LOADING IMAGE " << filename << std::endl;
>             }
>         }
>     }
>
>     virtual void drawImplementation(osg::RenderInfo & renderInfo)  
>const override
>     {
>         const float Z = 0.f;
>
>         osg::State * state = renderInfo.getState();
>         osg::GLBeginEndAdapter & gl = state->getGLBeginEndAdapter();
>
>         state->setActiveTextureUnit(0);
>
>         gl.Color4f(1.f, 1.f, 1.f, 1.f);
>
>         float x = 50.f, y = 50.f, w = 64.f, h = 64.f, offset;
>
>         offset = 0.f;
>
>         // apply the first texture so it will draw on the first rect
>         texture[0]->apply(*state);
>         gl.Begin(GL_QUADS);
>         gl.TexCoord2f(0.f, 0.f);
>         gl.Vertex3f(offset + x, y, Z);
>         gl.TexCoord2f(0.f, 1.f);
>         gl.Vertex3f(offset + x + w, y, Z);
>         gl.TexCoord2f(1.f, 1.f);
>         gl.Vertex3f(offset + x + w, y + h, Z);
>         gl.TexCoord2f(1.f, 0.f);
>         gl.Vertex3f(offset + x, y + h, Z);
>         gl.End();
>
>         offset = 256.f;
>
>         // apply the second texture so it will draw on the second rect
>         texture[1]->apply(*state);
>         gl.Begin(GL_QUADS);
>         gl.TexCoord2f(0.f, 0.f);
>         gl.Vertex3f(offset + x, y, Z);
>         gl.TexCoord2f(0.f, 1.f);
>         gl.Vertex3f(offset + x + w, y, Z);
>         gl.TexCoord2f(1.f, 1.f);
>         gl.Vertex3f(offset + x + w, y + h, Z);
>         gl.TexCoord2f(1.f, 0.f);
>         gl.Vertex3f(offset + x, y + h, Z);
>         gl.End();
>
>         offset = 512.f;
>
>         // apply the third texture so it will draw on the third rect
>         texture[2]->apply(*state);
>         gl.Begin(GL_QUADS);
>         gl.TexCoord2f(0.f, 0.f);
>         gl.Vertex3f(offset + x, y, Z);
>         gl.TexCoord2f(0.f, 1.f);
>         gl.Vertex3f(offset + x + w, y, Z);
>         gl.TexCoord2f(1.f, 1.f);
>         gl.Vertex3f(offset + x + w, y + h, Z);
>         gl.TexCoord2f(1.f, 0.f);
>         gl.Vertex3f(offset + x, y + h, Z);
>         gl.End();
>     }
>};
>
>Can you see what I'm doing wrong? No textures show up at all when I  
>try this code.
>
>Thank you,
>Aaron
>
>Quoting tianzjyh <tianzjyh@126.com>:
>
>> Hi, Andersen,
>> Let's say you have three images, then you can wrap them using  
>> osg::Texture2D, something like this:
>>     >
>>> osg::Image* image0 = osgDB::readImageFile("filename0.xxx");
>>> osg::Texture2D* tex0 = new osg::Texture2D(image0);
>>> tex1->setWrap(..., ...);
>>> tex1->setFilter(..., ...);
>>>
>>
>>
>> And then you can apply them in the drawImplementation() of your  
>> drawable like this :
>>>
>>> osg::State& state = *renderInfo.getState();
>>> state.setActiveTextureUnit(0);        //set texture unit 0 as  
>>> current texture
>>> tex0->apply(state);                        //apply texture paras to  
>>> current texture
>>> ...drawQuad0...
>>>
>>> ...deal with other two quads...
>>>
>>
>>
>> --
>>
>> Cheers,
>> ---
>> TianZJ
>>
>>
>>
>> At 2016-12-29 07:32:01, "Aaron Andersen" <aaron@fosslib.net> wrote:
>>> Hello,
>>>
>>> There is some code in a library which I want to adapt for OSG. The
>>> code is pretty old and uses the old style OpenGL. I don't have the
>>> time it would take to rewrite this code so I would like to use the
>>> GLBeginEndAdapter to make this code work with OSG.
>>>
>>> Looking at the GLBeginEndAdapter there isn't much documentation so I
>>> was hoping someone could help me out. Please keep in mind my OpenGL
>>> skills are lacking (which I why enjoy using a rendering engine like
>>> OSG :-).
>>>
>>> I've created a subclass to the Drawable class called "MyDrawable". In
>>> the drawImplementation function I'm have a couple
>>> gl.Begin(GL_QUADS)/gl.End() calls to draw 3 simple rectangles. I'm
>>> unsure of how to apply 3 separate textures to these 3 rectangles. From
>>> reading the ShapeDrawable class it looks like the state of the
>>> Drawable applies the texture to everything you draw.
>>>
>>> So how can I apply many different textures to my drawing, with 1
>>> texture per shape I draw with GL_QUADS?
>>>
>>> Thank you for any insight you can provide.
>>> Aaron
>>>
>>>
>>> _______________________________________________
>>> osg-users mailing list
>>> osg-users@lists.openscenegraph.org
>>> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>
>
>
>_______________________________________________
>osg-users mailing list
>osg-users@lists.openscenegraph.org
>http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
</pre></div><br><br><span title="neteasefooter"><p> </p></span>