使用OpenGL shader做一个能变灰的精灵

.h


class GraySprite :public Sprite

{

public:

    GraySprite();

    GraySprite(constchar* fileName);

   void setGray(bool bGray);

private:

   bool m_bGray;

};



.cpp


GraySprite::GraySprite()

{

    this->initWithFile("HelloWorld.png");

    this->setAnchorPoint(Vec2(0.5,0.5));

}


GraySprite::GraySprite(constchar* fileName)

{

   this->initWithFile(fileName);

    this->setAnchorPoint(Vec2(0.5,0.5));

}


voidGraySprite::setGray(bool bGray)

{

   if (m_bGray==bGray) {

       return;

    }

   m_bGray = bGray;

   if (bGray) {

       GLchar* pszFragSource = (GLchar*)

        "#ifdef GL_ES \n \

        precision mediump float; \n \

        #endif \n \

        uniform sampler2D u_texture; \n \

        varying vec2 v_texCoord; \n \

        varying vec4 v_fragmentColor; \n \

        void main(void) \n \

        { \n \

        // Convert to greyscale using NTSC weightings \n \

        vec4 col = texture2D(u_texture, v_texCoord); \n \

        float grey = dot(col.rgb, vec3(0.299, 0.587, 0.114)); \n \

        gl_FragColor = vec4(grey, grey, grey, col.a); \n \

        }";

        

       GLProgram* pProgram = new GLProgram();

        pProgram->initWithByteArrays(ccPositionTextureColor_noMVP_vert, pszFragSource);

       this->setGLProgram(pProgram);

        pProgram->release();

        CHECK_GL_ERROR_DEBUG();

        

        pProgram =this->getGLProgram();

        pProgram->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_POSITION,GLProgram::VERTEX_ATTRIB_POSITION);

        pProgram->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_COLOR,GLProgram::VERTEX_ATTRIB_COLOR);

        pProgram->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_TEX_COORD,GLProgram::VERTEX_ATTRIB_TEX_COORD);

        CHECK_GL_ERROR_DEBUG();

        

        pProgram->link();

        CHECK_GL_ERROR_DEBUG();

        

        pProgram->updateUniforms();

        CHECK_GL_ERROR_DEBUG();

    }

   else{

        setGLProgramState(GLProgramState::getOrCreateWithGLProgramName(GLProgram::SHADER_NAME_POSITION_TEXTURE_COLOR_NO_MVP));

    }

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要画一个渐变三角形,可以使用纹理和顶点颜色来实现,而无需使用着色器。以下是实现步骤: 1. 创建一个OpenGL窗口和OpenGL上下文。可以使用Qt的QtOpenGL模块来实现。 2. 创建一个三角形的顶点数组和颜色数组。顶点数组包含三个顶点的坐标,颜色数组包含三个顶点的颜色。 3. 创建一个纹理并加载一个渐变颜色图像。可以使用Qt的QImage和QOpenGLTexture类来实现。 4. 绑定纹理并设置纹理过滤器和纹理坐标。可以使用OpenGL的glBindTexture和glTexParameter函数来实现。 5. 启用顶点和颜色数组并设置顶点和颜色数据。可以使用OpenGL的glEnableClientState和glVertexPointer/glColorPointer函数来实现。 6. 绘制三角形并关闭顶点和颜色数组。可以使用OpenGL的glDrawArrays和glDisableClientState函数来实现。 以下是一个简单的Qt Opengl代码示例: ``` #include <QOpenGLWidget> #include <QOpenGLFunctions> #include <QOpenGLTexture> class GLWidget : public QOpenGLWidget, protected QOpenGLFunctions { public: GLWidget(QWidget *parent = nullptr) : QOpenGLWidget(parent) { } protected: void initializeGL() override { initializeOpenGLFunctions(); // 创建顶点和颜色数组 GLfloat vertices[] = { -0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 0.0f, 0.0f, 0.5f, 0.0f }; GLfloat colors[] = { 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f }; // 创建纹理并加载渐变颜色图像 QImage image(256, 1, QImage::Format_RGB888); for (int i = 0; i < 256; i++) { image.setPixelColor(i, 0, QColor(i, i, i)); } m_texture = new QOpenGLTexture(image); // 绑定纹理并设置过滤器和纹理坐标 m_texture->bind(); m_texture->setMinificationFilter(QOpenGLTexture::Nearest); m_texture->setMagnificationFilter(QOpenGLTexture::Linear); m_texture->setWrapMode(QOpenGLTexture::Repeat); // 启用顶点和颜色数组并设置顶点和颜色数据 glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_COLOR_ARRAY); glVertexPointer(3, GL_FLOAT, 0, vertices); glColorPointer(3, GL_FLOAT, 0, colors); // 绘制三角形并关闭顶点和颜色数组 glDrawArrays(GL_TRIANGLES, 0, 3); glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_COLOR_ARRAY); } private: QOpenGLTexture* m_texture; }; ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值