opengl +qt 显示图像 和 文本 纹理贴图 显示文本 20C

1.利用opengl对图片进行显示,点击图片画出一个角度,角度的线可以显示,但是角度的数字没有显示。我把文本的代码单独放到控制台显示,显示是正常的,所以推断可能是图片的纹理 对文本的显示造成了干扰,哪些代码影响到了。
图片说明

具体代码如下:
1> 图像关键代码:

    QImage GlImage = mpCurQImg->convertToFormat(QImage::Format_RGBA8888);
    glGenTextures(TEXTURE_SIZE,&m_TextureIndex);
    glBindTexture(GL_TEXTURE_2D,m_TextureIndex);
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, GlImage.width(), GlImage.height(), 0,
                  GL_RGBA, GL_UNSIGNED_BYTE, GlImage.bits() );

                     glPushMatrix();

glBindTexture(GL_TEXTURE_2D,m_TextureIndex);
glBegin( GL_QUADS );

glTexCoord2f( 0.0, 0.0 ); glVertex3f( pTextRect[0], pTextRect[2],0);
glTexCoord2f( 1.0, 0.0 ); glVertex3f( pTextRect[1], pTextRect[2],0);
glTexCoord2f( 1.0, 1.0 ); glVertex3f( pTextRect[1],  pTextRect[3],0);
glTexCoord2f( 0.0, 1.0 ); glVertex3f( pTextRect[0],  pTextRect[3],0);

glEnd();

glDisable(GL_TEXTURE_2D);
glDisable(GL_DEPTH_TEST);
glPopMatrix();                  

2>角度的数值显示代码:

DrawStringInfo(QString * str,QPointF pt)

glColor3f(1.0f, 0.0f, 0.0f);
glDisable(GL_DEPTH_TEST);
QByteArray ba = str->toLatin1();
const char*ch = "test";

glRasterPos2f(0.0f,0.0f);//测试放在中央
static int isFirstCall = 1;
static GLuint lists;

if (isFirstCall) 
{                     
    isFirstCall = 0;        
    lists = glGenLists(MAX_CHAR);       
    wglUseFontBitmaps(wglGetCurrentDC(), 0, MAX_CHAR, lists);
}   
for (; *ch != '\0'; ++ch)
{
    glCallList(lists + *ch);
}
glEnable(GL_DEPTH_TEST);

2个回答

绘制文本是不是被覆盖了!
建议按照显示的层级进行绘制:
1.绘制图片纹理;
2.绘制角度线;
3.绘制角度值。

w774937253
Calarence 我的绘制顺序是按照你说的那样的,就是不太清楚哪些函数影响了
8 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
opengl +qt 显示图像 和 文本 纹理贴图 显示文本
1.利用opengl对图片进行显示,点击图片画出一个角度,角度的线可以显示,但是角度的数字没有显示。我把文本的代码单独放到控制台显示,显示是正常的,所以推断可能是图片的纹理 对文本的显示造成了干扰,哪些代码影响到了。 ![图片说明](https://img-ask.csdn.net/upload/201906/20/1561032261_180148.jpg) 具体代码如下: 1> 图像关键代码: QImage GlImage = mpCurQImg->convertToFormat(QImage::Format_RGBA8888); glGenTextures(TEXTURE_SIZE,&m_TextureIndex); glBindTexture(GL_TEXTURE_2D,m_TextureIndex); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, GlImage.width(), GlImage.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, GlImage.bits() ); glPushMatrix(); glBindTexture(GL_TEXTURE_2D,m_TextureIndex); glBegin( GL_QUADS ); glTexCoord2f( 0.0, 0.0 ); glVertex3f( pTextRect[0], pTextRect[2],0); glTexCoord2f( 1.0, 0.0 ); glVertex3f( pTextRect[1], pTextRect[2],0); glTexCoord2f( 1.0, 1.0 ); glVertex3f( pTextRect[1], pTextRect[3],0); glTexCoord2f( 0.0, 1.0 ); glVertex3f( pTextRect[0], pTextRect[3],0); glEnd(); glDisable(GL_TEXTURE_2D); glDisable(GL_DEPTH_TEST); glPopMatrix(); ``` ``` 2>角度的数值显示代码: DrawStringInfo(QString * str,QPointF pt) glColor3f(1.0f, 0.0f, 0.0f); glDisable(GL_DEPTH_TEST); QByteArray ba = str->toLatin1(); const char*ch = "test"; glRasterPos2f(0.0f,0.0f);//测试放在中央 static int isFirstCall = 1; static GLuint lists; if (isFirstCall) { isFirstCall = 0; lists = glGenLists(MAX_CHAR); wglUseFontBitmaps(wglGetCurrentDC(), 0, MAX_CHAR, lists); } for (; *ch != '\0'; ++ch) { glCallList(lists + *ch); } glEnable(GL_DEPTH_TEST);
opengl纹理贴图的插值
大家好。我在编写opengl的时候,想做出纹理贴图的插值。 好比,一张纹理是f1(x),一张为f2(x)。能够得到g(x)= t * f1(x)+ (1-t)* f2(x) t:0~1 这样的效果. 谢谢~
OpenGL ES3.0纹理贴图问题,贴图发生错误,无法显示贴图细节是怎么回事啊?
最近在学习OpenGL ES,按照书上教程尝试写了个demo,然后发现在纹理贴图这块遇到问题了,求助各位大佬 程序思路很简单,画5个点然后贴上纹理,但是纹理总是出现错误,下面是截图: ![图片说明](https://img-ask.csdn.net/upload/202002/12/1581502455_517510.jpg) 这个是要贴的纹理,大小为512 \*1024,另外正方形纹理我也试过同样不行 ![图片说明](https://img-ask.csdn.net/upload/202002/12/1581502536_603856.png) 接下来是代码: 首先是Render: ```java package com.example.firstopengl; import android.content.Context; import android.opengl.GLES30; import android.opengl.GLSurfaceView; import android.opengl.Matrix; import com.airhockey.android.objects.Mallet; import com.airhockey.android.objects.Table; import com.airhockey.android.programs.ColorShaderProgram; import com.airhockey.android.programs.TextureShaderProgram; import com.airhockey.android.util.MatrixHelper; import com.airhockey.android.util.TextureHelper; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; public class AirHockeyRender implements GLSurfaceView.Renderer { private final String TAG = "AirHockeyRender"; private final Context context; private final float[] projectionMatrix = new float[16]; private final float[] modelMatrix = new float[16]; private Table table; private Mallet mallet; private TextureShaderProgram textureShaderProgram; private ColorShaderProgram colorShaderProgram; private int texture; public AirHockeyRender(Context context){ this.context = context; } @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { GLES30.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); table = new Table(); mallet = new Mallet(); textureShaderProgram = new TextureShaderProgram(context); colorShaderProgram = new ColorShaderProgram(context); texture = TextureHelper.loadTexture(context, R.drawable.air_hockey_surface); } @Override public void onDrawFrame(GL10 gl) { GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT); textureShaderProgram.useProgram(); textureShaderProgram.setUniforms(projectionMatrix, texture); table.bindData(textureShaderProgram); table.draw(); colorShaderProgram.useProgram(); colorShaderProgram.setUniform(projectionMatrix); mallet.bindData(colorShaderProgram); mallet.draw(); } @Override public void onSurfaceChanged(GL10 gl, int width, int height) { final float[] temp = new float[16]; //设置视口 GLES30.glViewport(0, 0, width, height); MatrixHelper.perspectiveM(projectionMatrix, 45, (float)width/(float)height, 1f, 10f); Matrix.setIdentityM(modelMatrix, 0); Matrix.translateM(modelMatrix, 0, 0f, 0f, -3.1f); Matrix.rotateM(modelMatrix, 0, -60f, 1f, 0f, 0f); Matrix.multiplyMM(temp, 0 ,projectionMatrix, 0, modelMatrix, 0); System.arraycopy(temp, 0, projectionMatrix, 0, temp.length); } } ``` 接下来是纹理生成相关 ``` package com.airhockey.android.util; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.opengl.GLES30; import android.opengl.GLUtils; import android.util.Log; import com.airhockey.android.Constants; import java.io.ByteArrayOutputStream; import java.nio.ByteBuffer; import java.nio.ByteOrder; public class TextureHelper { private final static String TAG = "TextureHelper"; public static int loadTexture(Context context, int resourceId){ final int[] textureObject = new int[1]; GLES30.glGenTextures(1, textureObject, 0); if(textureObject[0]==0){ if(LoggerConfig.ON){ Log.w(TAG, "Could not generate a new OpenGL texture object"); } return 0; } final BitmapFactory.Options options = new BitmapFactory.Options(); //需要原始的图像数据,而不是缩放的版本 options.inScaled = false; //将图像转换为位图 final Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), resourceId, options); if(bitmap==null){ if(LoggerConfig.ON){ Log.w(TAG, "Resource ID"+resourceId+"could not be decoded"); } GLES30.glDeleteTextures(1, textureObject, 0); return 0; } //告诉opengl纹理调用使用此纹理 GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, textureObject[0]); GLES30.glTexParameteri(GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_MIN_FILTER, GLES30.GL_LINEAR_MIPMAP_LINEAR); GLES30.glTexParameteri(GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_MAG_FILTER, GLES30.GL_LINEAR); GLES30.glTexParameterf(GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_WRAP_S, GLES30.GL_REPEAT); GLES30.glTexParameterf(GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_WRAP_T, GLES30.GL_REPEAT); //将位图加载至opengl中 GLUtils.texImage2D(GLES30.GL_TEXTURE_2D, 0, bitmap, 0); //加载后释放位图,解除绑定 bitmap.recycle(); //生成mip贴图 GLES30.glGenerateMipmap(GLES30.GL_TEXTURE_2D); GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, 0); return textureObject[0]; } } ``` 然后是画的物体: ``` package com.airhockey.android.objects; import android.opengl.GLES30; import com.airhockey.android.Constants; import com.airhockey.android.data.VertexArray; import com.airhockey.android.programs.TextureShaderProgram; public class Table { private static final int POSITION_COMPONENT_COUNT = 2; private static final int TEXTURE_COORDINATES_COMPONENT_COUNT = 2; private static final int STRIDE = (POSITION_COMPONENT_COUNT+TEXTURE_COORDINATES_COMPONENT_COUNT) * Constants.BYTE_PER_FLOAT; private final VertexArray vertexArray; private static final float[] VERTEX_DATA = { //x,y,s,t //三角扇区 0f, 0f, 0.5f, 0.5f, -0.5f, -0.8f, 0.0f, 1.0f, 0.5f, -0.8f, 1.0f, 1.0f, 0.5f, 0.8f, 1.0f, 0.0f, -0.5f, 0.8f, 0.0f, 0.0f, -0.5f, -0.8f, 0.0f, 1.0f // -0.5f, -0.8f, 0f, 1f, // -0.5f, 0.8f, 0f, 0f, // 0.5f, -0.8f, 1f, 1f, // // -0.5f, 0.8f, 0f, 0f, // 0.5f, -0.8f, 1f, 1f, // 0.5f, 0.8f, 1f, 0f }; public Table(){ vertexArray = new VertexArray(VERTEX_DATA); } public void bindData(TextureShaderProgram textureProgram){ vertexArray.setVertexAttribPointer(0, textureProgram.getPositonAttributeLocation(), POSITION_COMPONENT_COUNT, STRIDE); vertexArray.setVertexAttribPointer(POSITION_COMPONENT_COUNT, textureProgram.getTextureCoordinatesAttributeLocation(), TEXTURE_COORDINATES_COMPONENT_COUNT, STRIDE); } public void draw(){ GLES30.glDrawArrays(GLES30.GL_TRIANGLE_FAN, 0, 6); } } ``` 头真的大,研究了好久都没研究出来怎么回事
QT+opengl加载模型切换线程后的显示问题
在QT的GUI线程里加载模型后可以正常显示,在线程里打开的模型却不能在ui里显示,GUI线程里点击一个按钮后开启一个线程进行模型读入,在这个线程里读完模型数据后通过信号返回通知GUI线程模型读入完毕然后加载。请问下有没有谁知道怎么解决这个问题?
opengl shadow mapping 和原有纹理冲突
在opengl的阴影贴图的时候,创建了阴影纹理之后,要对当前纹理状态改变,然后绘制模型,但是我模型里面有之前的问题,改变了纹理状态之后之前的纹理就会错乱了,不知道怎么能在不影响之前的纹理的情况下创建阴影贴图呢
opengl 球形纹理映射纹理显示不清晰原因
使用opengl做球形自动纹理映射,显示出来的图像没有原图清晰。 请问可能是什么原因? 下面是原图 ![图片说明](https://img-ask.csdn.net/upload/201612/19/1482118556_16404.jpg) 球形映射后的球体表面图如下。 ![图片说明](https://img-ask.csdn.net/upload/201612/19/1482118777_250720.png)
OpenGL 纹理映射无法显示纹理
初学者,希望大侠们能做个解答,小弟在此先行谢过,问题很简单,但我琢磨好久都没搞出来,也找不出问题所在。 想要实现的的功能也很简单,就是纹理。 问题所在:运行之后只有背景,没有纹理 开发环境:Eclipse ADT 源代码: 一、SRC/ SFGame.java package com.gamewenli; import android.app.Activity; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.opengl.GLSurfaceView; import android.opengl.GLSurfaceView.Renderer; import android.os.Bundle; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.widget.Button; public class SFGame extends Activity { Renderer render = new SFBameRenderer(this); GLSurfaceView gameView; Button start; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); GLImage.load(this.getResources()); gameView = new GLSurfaceView(this); gameView.setRenderer(render); setContentView(R.layout.pageone); start = (Button) findViewById(R.id.button1); start.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { setContentView(gameView); } }); 二、 SRC/SFBameRenderer.java package com.gamewenli; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; import android.content.Context; import android.opengl.GLSurfaceView.Renderer; import android.opengl.GLUtils; public class SFBameRenderer implements Renderer { public Context context; private int[] textureids; private FloatBuffer vertexBuffer; private FloatBuffer textureBuffer; //private ByteBuffer indexBuffer; //vertices[]数组会列出一系列的点,其中每一行代表正方形一角的X,Y,Z的值. private float vertices[] ={ 0f, 0f, 0f, 1f, 0f, 0f, 1f, 1f, 0f, 0f, 1f, 0f, }; //texture[]数组表示纹理的四角在何处能与所创建的正方形四角排成一条直线 private float texture[] = { 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f }; //indices[]数组表示正方形表面的定义,正方形的表面被划分为两个三角形,该数组就是逆时针方向上这些三角形的角度数。 //private byte indices[] = { //0, 1, 2, //0, 2, 3 //}; public SFBameRenderer(Context context) { this.context = context; textureids = new int[1]; ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4); vbb.order(ByteOrder.nativeOrder()); vertexBuffer = vbb.asFloatBuffer(); vertexBuffer.put(vertices); vertexBuffer.position(0); ByteBuffer tbb = ByteBuffer.allocateDirect(texture.length * 4); tbb.order(ByteOrder.nativeOrder()); textureBuffer = tbb.asFloatBuffer(); //indexBuffer = ByteBuffer.allocateDirect(indices.length); //indexBuffer.put(indices); //indexBuffer.position(0); //为正方形贴上纹理 //for (int i = 0; i < 1; i++) { textureBuffer.put(texture); //} textureBuffer.position(0); } @Override public void onDrawFrame(GL10 gl) { // 清除屏幕和深度缓存 gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); // 重置当前的模型观察矩阵 gl.glLoadIdentity(); // 开启顶点和纹理功能(开启顶点和纹理缓冲) gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); // 设置顶点和纹理 gl.glVertexPointer(3, GL10.GL_FIXED, 0, vertexBuffer); gl.glTexCoordPointer(3, GL10.GL_FIXED, 0, textureBuffer); // 绘制正方形 //int i = 1; //switch (i) { //case 0: // 生成纹理 GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, GLImage.iBitmap, 0); // 关闭顶点和纹理功能 gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); } //} @Override public void onSurfaceChanged(GL10 gl, int width, int height) { float ratio = (float) (width) / height; // 设置OpenGL场景的大小 gl.glViewport(0, 0, width, height); // 设置投影矩阵 gl.glMatrixMode(GL10.GL_PROJECTION); // 重置投影矩阵 gl.glLoadIdentity(); // 设置视口的大小 gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10); // 选择模型观察矩阵 gl.glMatrixMode(GL10.GL_MODELVIEW); // 重置模型观察矩阵 gl.glLoadIdentity(); } @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { // 告诉系统对透视进行修正 gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST); // 绿色背景 gl.glClearColor(0, 1, 0, 0); gl.glEnable(GL10.GL_CULL_FACE); // 启用阴影平滑 gl.glShadeModel(GL10.GL_SMOOTH); // 启用深度测试 gl.glEnable(GL10.GL_DEPTH_TEST); //启用纹理映射 gl.glClearDepthf(1.0f); //深度测试的类型 gl.glDepthFunc(GL10.GL_LEQUAL); // 允许2D贴图,纹理 gl.glEnable(GL10.GL_TEXTURE_2D); gl.glEnable(GL10.GL_BLEND); gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE); // 创建纹理 gl.glGenTextures(1, textureids, 0); // 绑定要使用的纹理 gl.glBindTexture(GL10.GL_TEXTURE_2D, textureids[0]); GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, GLImage.iBitmap, 0); // 线性滤波 gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); } } } } class GLImage { public static Bitmap iBitmap; public static Bitmap close_Bitmap; public static void load(Resources resources) { iBitmap = BitmapFactory.decodeResource(resources, R.drawable.wall); } } 三、 RES/Androidmanifest.xml <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.gamewenli" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="19" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="SFGame"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
QT的界面,底层是不是用OpenGL画出来的?
1、QT的各种界面是不是用OpenGL画出来的?然后在处理控件响应? 2、QT开发任何程序都不用操作系统API吗?只用QT就能开发任何程序? 3、如果第二种不满足,那哪类程序需调用API?
用opengl纹理实现地球仪 问题
纹理已经正确加载,但是在没用纹理矩阵时纹理根本动不了。如果用glMatrixMode(GL_TEXTURE) 转动很奇怪,而且感觉纹理没很好的铺满球体。求正确方法我的显示代码: glMatrixMode(GL_MODELVIEW); glPushMatrix(); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glBindTexture(GL_TEXTURE_2D,texture1); glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T); glMatrixMode(GL_TEXTURE); //不使用纹理矩阵时,纹理动不了 glRotatef(angle,0,1,0); //angle递增,纹理能动,但好像并不是简单的旋转 glTexGeni(GL_S,GL_TEXTURE_GEN_MODE,GL_SPHERE_MAP); glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_SPHERE_MAP); glPopMatrix();glMatrixMode(GL_MODELVIEW); glRotatef(angle,0,1,0); glutSolidSphere(0.5,30,30); glPopMatrix(); glFlush();网上有用glu库二次曲面的,是可以的,这个就不要再说了。
请问如何将OpenGL中的纹理单元传递给片段着色器???
小白我最近在学习GLSL,绝对的菜鸟级别啊~ 今天遇到了一个问题,我用 *texture[1]* 在程序中存储了一个纹理,然后使用了下面两行代码将纹理传递给片段着色器,程序是可以运行的 *texUnitLoc = glGetUniformLocation(p, "tex"); glUniform1i(texUnitLoc, 0);* 但是当我在程序中存储两个纹理以后,想要将两个纹理都传递到着色器时,应该怎么办啊??将上面代码中的‘0’换做‘texture[0]’也不管用啊,什么都不管用啊,glUniform究竟是怎么一回事啊?求大神指点~~T_T 附代码如下: #include <stdio.h> #include <stdlib.h> #include <GL/glew.h> #include <GL/glut.h> #include <glaux.h> #include "textfile.h" #include "printInfoLog.h" GLfloat LightAmbient0[]= {1, 1, 1, 1.0f }; GLfloat LightDiffuse0[]= {1.0f, 1.0f, 1.0f, 1.0f }; GLfloat LightSpecular0[]={1.0f, 1.0f, 1.0f, 1.0f}; GLfloat LightPosition0[]= {3.0f, 3.0f, 3.0f, 0.0f }; GLfloat MaterialAmbient[] = {0.3, 0.3, 0.3, 1.0f}; GLfloat MaterialDiffuse[] = {0.7, 0.7, 0.7, 1.0f}; GLfloat MaterialSpecular[] ={0.3, 0.3, 0.3, 1.0f}; GLfloat MaterialSe = 64.0f; GLUquadricObj *quadratic; GLuint texture[2]; // 存储一个纹理 GLint texUnitLoc,l3dUnitLoc; float a = 0.0f; GLuint v,f,p; float t = 0; GLint loc; AUX_RGBImageRec *LoadBMP(char *Filename) // 载入位图图象 { FILE *File=NULL; // 文件句柄 if (!Filename) // 确保文件名已提供 { return NULL; // 如果没提供,返回 NULL } File=fopen(Filename,"r"); // 尝试打开文件 if (File) // 文件存在么? { fclose(File); // 关闭句柄 return auxDIBImageLoad(Filename);// 载入位图并返回指针 } return NULL; // 如果载入失败,返回 NULL } int LoadGLTextures() // 载入位图(调用上面的代码)并转换成纹理 { int Status=FALSE; // 状态指示器 AUX_RGBImageRec *TextureImage[2]; // 创建纹理的存储空间 memset(TextureImage,0,sizeof(void *)*1); // 将指针设为 NULL // 载入位图,检查有无错误,如果位图没找到则退出 if (TextureImage[0]=LoadBMP("Data/Crate.bmp")) { Status=TRUE; // 将 Status 设为 TRUE glGenTextures(1, &texture[0]); // 创建纹理 // 创建 MipMapped 纹理 glBindTexture(GL_TEXTURE_2D, texture[0]); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST); gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data); } if (TextureImage[0]) // 纹理是否存在 { if (TextureImage[0]->data) // 纹理图像是否存在 { free(TextureImage[0]->data); // 释放纹理图像占用的内存 } free(TextureImage[0]); // 释放图像结构 } if (TextureImage[1]=LoadBMP("Data/1.bmp")) { Status=TRUE; // 将 Status 设为 TRUE glGenTextures(1, &texture[1]); // 创建纹理 // 创建 MipMapped 纹理 glBindTexture(GL_TEXTURE_2D, texture[1]); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST); gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[1]->sizeX, TextureImage[1]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[1]->data); } if (TextureImage[1]) // 纹理是否存在 { if (TextureImage[1]->data) // 纹理图像是否存在 { free(TextureImage[1]->data); // 释放纹理图像占用的内存 } free(TextureImage[1]); // 释放图像结构 } return Status; // 返回 Status } void changeSize(int w, int h) { float ratio = 1.0* w / h; glMatrixMode(GL_PROJECTION); glLoadIdentity(); glViewport(0, 0, w, h); gluPerspective(45,ratio,1,100); glMatrixMode(GL_MODELVIEW); } void init() { glEnable(GL_DEPTH_TEST); glClearColor(0.0,0.0,0.0,0.0); glEnable(GL_CULL_FACE); glEnable(GL_LIGHTING); glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmbient0); glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiffuse0); glLightfv(GL_LIGHT0,GL_SPECULAR, LightSpecular0); glLightfv(GL_LIGHT0, GL_POSITION, LightPosition0); glEnable(GL_LIGHT0); glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, MaterialAmbient); glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialDiffuse); glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR, MaterialSpecular); glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS, MaterialSe); quadratic=gluNewQuadric(); gluQuadricNormals(quadratic, GLU_SMOOTH); gluQuadricTexture(quadratic, GL_TRUE); LoadGLTextures(); // 调用纹理载入子例程 glEnable(GL_TEXTURE_2D); // 启用纹理映射 } void renderScene(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); gluLookAt(0.0,0.0,5.0, 0.0,0.0,-1.0, 0.0f,1.0f,0.0f); a += 0.35f; if(a > 360) a -= 360.0f; glRotatef(a, 0, 1, 0); glRotatef(0, 1, 0, 0); //glBindTexture(GL_TEXTURE_2D, texture[0]); gluSphere(quadratic, 1, 32, 16); t+=0.01; glutPostRedisplay(); glutSwapBuffers(); } int main(int argc, char **argv) { void setShaders(); glutInit(&argc, argv); glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); glutCreateWindow("GLSL DEMO"); init(); glutDisplayFunc(renderScene); glutReshapeFunc(changeSize); glewInit(); if (glewIsSupported("GL_VERSION_2_0")) printf("Ready for OpenGL 2.0\n"); else { printf("OpenGL 2.0 not supported\n"); exit(1); } setShaders(); texUnitLoc = glGetUniformLocation(p, "tex"); glUniform1i(texUnitLoc, 0); //l3dUnitLoc = glGetUniformLocation(p, "l3d"); //glUniform1i(l3dUnitLoc, texture[1]); glutMainLoop(); return 0; } void setShaders() { char *vs = NULL,*fs = NULL,*fs2 = NULL; v = glCreateShader(GL_VERTEX_SHADER); f = glCreateShader(GL_FRAGMENT_SHADER); vs = textFileRead("vs.txt"); fs = textFileRead("fs.txt"); const char * vv = vs; const char * ff = fs; glShaderSource(v, 1, &vv,NULL); glShaderSource(f, 1, &ff,NULL); free(vs);free(fs); glCompileShader(v); glCompileShader(f); printShaderInfoLog(v); printShaderInfoLog(f); p = glCreateProgram(); glAttachShader(p,v); glAttachShader(p,f); glLinkProgram(p); printProgramInfoLog(p); glUseProgram(p); //将p改为0表示使用固定的管线 }
OPENGL如何动态显示数字
我想在一个坐标轴上显示很多坐标,我一般用glRasterPos2f(0,-0.1); //起始位置 drawString("1");来显示文字,但是坐标要标注的太多了,我也不能一个一个的写出位置来啊,有什么简单的方法显示吗?就像c语言中“for(int i=0;i<4;i++) printf("%d\n",i)”中这种可以自动地显示出来
QCamera与OpenGL显示摄像头视频
用QCamera做了个摄像头视频采集程序, 现在想将视频显示在OpenGL的模型上应该怎么处理呀 看帖子一般OpenGL都是使用纹理贴图来完成, opencv的话有cvQueryFrame命令 问题是QCamera 貌似没有 类似返回每帧图片的命令呀 该如何操作 求大神指点
opengl显示列表创建失败
if (texSize > 0) { glDeleteTextures(texSize,textures); glDeleteLists(displayListIdx0,texSize); } if (textures) { delete []textures; textures = NULL; } texSize = vTiles.size(); textures = new GLuint[texSize]; memset(textures,0,sizeof(GLuint)*texSize); glGenTextures(nTiles,textures); displayList = glGenLists(nTiles); displayListIdx0 = textures[0]; 这段代码意思是首先删除之前创建的显示列表,然后创建新的显示列表以便后面绑定纹理。现在的问题是glGenTextures()有时候失败,哪位大神给指导一下,重谢!
有没有熟悉OpenGL的大神?求救急!!!
我想用OpenGL实现一个对三维模型的纹理贴图。有OBJ格式的模型数据和影像数据。我的C币不足没法悬赏,求求会的大神帮帮我,定会答谢!!!
关于opengl中贴图的问题
屏幕上有个矩形,选中进行贴图。图形是水平的,若矩形是水平的贴图很简单,但若矩形是斜的怎么办?尝试逐像素对应贴图但计算公式带来误差,会使某些像素点没有贴上,有什么好的方法吗
用Vc++opengl三维显示
用Vc++opengl实现读取TXT文件的坐标显示三维图像 用为彩色渲染
OpenGL加载字体纹理出错!!
OpenGL使用glTexSubImage2D和FreeType library生成的字体纹理显示出错,见下图,折磨了我半个月没找到原因,求大神解答!! ![图片说明](https://img-ask.csdn.net/upload/201805/29/1527573523_553716.png)
opengl es绘制纹理的问题
为什么我绘制的纹理总是在屏幕的右上角,我怎么才能才纹理的中心点位于opengl的原点呢。
OpenGL图像显示和别人不一样
用老师给的源代码,原封不动运行,图像异常 原本应该是这样的 ![原本的样子](https://img-ask.csdn.net/upload/201909/20/1568908959_14748.png) 然后我电脑上是这样子的 ![我运行出来的样子](https://img-ask.csdn.net/upload/201909/20/1568908978_338083.png) 下面附上main.cpp的代码 (第一次遇到这样的问题,百度谷歌弄了一下午,把VS2013卸载安装了2019,还是搞不定,求大神帮忙,感激不尽) ``` #include "Angel.h" #pragma comment(lib, "glew32.lib") const int MENU_CHOICE_WHITE = 0; const int MENU_CHOICE_BLACK = 1; const int MENU_CHOICE_RED = 2; const int MENU_CHOICE_GREEN = 3; const int MENU_CHOICE_BLUE = 4; const int MENU_CHOICE_YELLOW = 5; const int MENU_CHOICE_ORANGE = 6; const int MENU_CHOICE_PURPLE = 7; const vec3 WHITE(1.0, 1.0, 1.0); const vec3 BLACK(0.0, 0.0, 0.0); const vec3 RED(1.0, 0.0, 0.0); const vec3 GREEN(0.0, 1.0, 0.0); const vec3 BLUE(0.0, 0.0, 1.0); const vec3 YELLOW(1.0, 1.0, 0.0); const vec3 ORANGE(1.0, 0.65, 0.0); const vec3 PURPLE(0.8, 0.0, 0.8); // 主窗口变量 const int SQUARE_NUM = 6; const int SQUARE_NUM_POINTS = 4 * SQUARE_NUM; int mainWindow; int mainWindowMenu; int mainWindowSubmenu; int width = 600; // 主窗口宽度 int height = 600; // 主窗口高度 double offsetAngle = 0; // 角度偏移量 double delta = 0.05; // 每次改变角度偏移的变化量 vec3 mainWindowSquareColor = WHITE; // 子窗口变量 const int ELLIPSE_NUM_POINTS = 100; int subWindow; int subWindowMenu; vec3 subWindowObjectColor = RED; // 获得圆上的点 vec2 getEllipseVertex(vec2 center, double scale, double verticleScale, double angle) { vec2 vertex(sin(angle), cos(angle)); vertex += center; vertex *= scale; vertex.y *= verticleScale; // 修改垂直分量 return vertex; } // 生成圆上顶点的属性 void generateEllipsePoints(vec2 vertices[], vec3 colors[], vec3 color, int startVertexIndex, int numPoints, vec2 center, double scale, double verticalScale) { double angleIncrement = (2 * M_PI) / numPoints; double currentAngle = M_PI / 2; for (int i = startVertexIndex; i < startVertexIndex + numPoints; i++) { vertices[i] = getEllipseVertex(center, scale, verticalScale, currentAngle); colors[i] = color; currentAngle += angleIncrement; } } // 获得正方形的每个角度 double getSquareAngle(int point) { return (M_PI / 4 + (M_PI / 2 * point)) + offsetAngle; } // 生成正方形上顶点的属性 void generateSquarePoints(vec2 vertices[], vec3 colors[], int squareNum, int startVertexIndex) { double scale = 0.90; double scaleAdjust = scale / squareNum; vec2 center(0.0, -0.25); int vertexIndex = startVertexIndex; for (int i = 0; i < squareNum; i++) { vec3 currentColor = 0 == i % 2 ? mainWindowSquareColor : BLACK; for (int j = 0; j < 4; j++) { double currentAngle = getSquareAngle(j); vertices[vertexIndex] = vec2(sin(currentAngle), cos(currentAngle)) * scale + center; colors[vertexIndex] = currentColor; vertexIndex++; } scale -= scaleAdjust; } } // 空闲回调函数 void idleFunction() { // 改变角度的偏移量 offsetAngle += delta; // 标记主窗口重绘 glutPostWindowRedisplay(mainWindow); } void mainWindowInit() { vec2 vertices[SQUARE_NUM * 4]; vec3 colors[SQUARE_NUM * 4]; // 创建主窗口中多个正方形 generateSquarePoints(vertices, colors, SQUARE_NUM, 0); // 创建顶点数组对象 GLuint vao[1]; glGenVertexArrays(1, vao); glBindVertexArray(vao[0]); // 创建并初始化顶点缓存对象 GLuint buffer; glGenBuffers(1, &buffer); glBindBuffer(GL_ARRAY_BUFFER, buffer); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices) + sizeof(colors), NULL, GL_STATIC_DRAW); // 分别读取数据 glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices); glBufferSubData(GL_ARRAY_BUFFER, sizeof(vertices), sizeof(colors), colors); // 读取着色器并使用 GLuint program = InitShader("vshader.glsl", "fshader.glsl"); glUseProgram(program); // 从顶点着色器中初始化顶点的位置 GLuint pLocation = glGetAttribLocation(program, "vPosition"); glEnableVertexAttribArray(pLocation); glVertexAttribPointer(pLocation, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); // 从片元着色器中初始化顶点的颜色 GLuint cLocation = glGetAttribLocation(program, "vColor"); glEnableVertexAttribArray(cLocation); glVertexAttribPointer(cLocation, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(sizeof(vertices))); // 黑色背景 glClearColor(0.0, 0.0, 0.0, 1.0); } // 菜单回调函数 void mainWindowMenuEvents(int menuChoice) { switch (menuChoice) { case MENU_CHOICE_WHITE: mainWindowSquareColor = WHITE; break; case MENU_CHOICE_BLACK: mainWindowSquareColor = BLACK; break; case MENU_CHOICE_RED: mainWindowSquareColor = RED; break; case MENU_CHOICE_GREEN: mainWindowSquareColor = GREEN; break; case MENU_CHOICE_BLUE: mainWindowSquareColor = BLUE; break; case MENU_CHOICE_YELLOW: mainWindowSquareColor = YELLOW; break; case MENU_CHOICE_ORANGE: mainWindowSquareColor = ORANGE; break; case MENU_CHOICE_PURPLE: mainWindowSquareColor = PURPLE; break; /*在此处添加控制旋转动画开始和停止的菜单选项*/ } // 标记mainWindow主窗口进行重绘 glutPostWindowRedisplay(mainWindow); } // 创建和设置主窗口菜单 void mainWindowSetupMenu() { // 创建子菜单,并注册菜单回调函数mainWindowMenuEvents mainWindowSubmenu = glutCreateMenu(mainWindowMenuEvents); glutAddMenuEntry("Yellow", MENU_CHOICE_YELLOW); glutAddMenuEntry("Orange", MENU_CHOICE_ORANGE); glutAddMenuEntry("Purple", MENU_CHOICE_PURPLE); glutAddMenuEntry("Black", MENU_CHOICE_BLACK); // 创建主菜单 mainWindowMenu = glutCreateMenu(mainWindowMenuEvents); glutAddMenuEntry("Red", MENU_CHOICE_RED); glutAddMenuEntry("Green", MENU_CHOICE_GREEN); glutAddMenuEntry("Blue", MENU_CHOICE_BLUE); glutAddMenuEntry("White", MENU_CHOICE_WHITE); // 在主菜单中添加子菜单 glutAddSubMenu("Other Square Colors", mainWindowSubmenu); // 关联鼠标右键激活菜单 glutAttachMenu(GLUT_RIGHT_BUTTON); } void mainWindowDisplay() { mainWindowInit(); // 重绘时写入新的颜色数据 glClear(GL_COLOR_BUFFER_BIT); for (int i = 0; i < SQUARE_NUM; i++) { glDrawArrays(GL_TRIANGLE_FAN, (i * 4), 4); } glutSwapBuffers(); } // 主窗口键盘回调函数 void mainWindowKeyboard(unsigned char key, int x, int y) { /*在此添加按下Esc按键退出的代码*/ } // 主窗口鼠标回调函数 void mainWindowMouse(int button, int state, int x, int y) { if (button == GLUT_MIDDLE_BUTTON && state == GLUT_DOWN) { // 按下鼠标中键,指定当没有其他事件处理时,去调用idleFunction()这个函数 glutIdleFunc(idleFunction); } else if (button == GLUT_MIDDLE_BUTTON && state == GLUT_UP) { // 释放鼠标中键,解除调用 glutIdleFunc(NULL); } } void subWindowInit() { vec2 vertices[ELLIPSE_NUM_POINTS]; vec3 colors[ELLIPSE_NUM_POINTS]; // 创建子窗口中的椭圆 generateEllipsePoints(vertices, colors, subWindowObjectColor, 0, ELLIPSE_NUM_POINTS, vec2(0.0, 0.0), 0.7, 0.5); // 创建顶点数组对象 GLuint vao[1]; glGenVertexArrays(1, vao); glBindVertexArray(vao[0]); // 创建并初始化顶点缓存对象 GLuint buffer; glGenBuffers(1, &buffer); glBindBuffer(GL_ARRAY_BUFFER, buffer); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices) + sizeof(colors), NULL, GL_STATIC_DRAW); // 分别读取数据 glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices); glBufferSubData(GL_ARRAY_BUFFER, sizeof(vertices), sizeof(colors), colors); // 读取着色器并复用 GLuint program = InitShader("vshader.glsl", "fshader.glsl"); glUseProgram(program); // 从顶点着色器中初始化顶点的位置 GLuint pLocation = glGetAttribLocation(program, "vPosition"); glEnableVertexAttribArray(pLocation); glVertexAttribPointer(pLocation, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); // 从片元着色器中初始化顶点的颜色 GLuint cLocation = glGetAttribLocation(program, "vColor"); glEnableVertexAttribArray(cLocation); glVertexAttribPointer(cLocation, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(sizeof(vertices))); // 设置子窗口背景颜色为白色 glClearColor(1.0, 1.0, 1.0, 1.0); } void subWindowDisplay() { subWindowInit(); // 重绘时写入新的颜色数据 glClear(GL_COLOR_BUFFER_BIT); glDrawArrays(GL_TRIANGLE_FAN, 0, ELLIPSE_NUM_POINTS); glutSwapBuffers(); } // 子窗口键盘回调函数 void subWindowKeyboard(unsigned char key, int x, int y) { switch (key) { case 'r': subWindowObjectColor = RED; break; case 'g': subWindowObjectColor = GREEN; break; case 'b': subWindowObjectColor = BLUE; break; case 'y': subWindowObjectColor = YELLOW; break; case 'o': subWindowObjectColor = ORANGE; break; case 'p': subWindowObjectColor = PURPLE; break; case 'w': subWindowObjectColor = WHITE; break; } // 标记subWindow子窗口进行重绘 glutPostWindowRedisplay(subWindow); } void printHelp() { printf("%s\n\n", "Interaction and Submenu"); printf("Keys to update the background color in sub window:\n"); printf("'r' - red\n'g' - green\n'b' - blue\n'y' - yellow\n'o' - orange\n'p' - purple\n'w' - white\n"); } int main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); // 启用双重缓冲 glutInitWindowSize(width, height); mainWindow = glutCreateWindow("Interaction and Submenu"); glewExperimental = GL_TRUE; glewInit(); mainWindowInit(); mainWindowSetupMenu(); glutDisplayFunc(mainWindowDisplay); // 在主窗口中指定函数mainWindowMouse,在鼠标按下或释放时将会被调用 glutMouseFunc(mainWindowMouse); // 创建子窗口 subWindow = glutCreateSubWindow(mainWindow, 0, 0, width / 4, height / 4); subWindowInit(); glutDisplayFunc(subWindowDisplay); // 在子窗口中指定函数subWindowKeyboard,当一个能够生成ASCII字符的键释放时会被调用 glutKeyboardFunc(subWindowKeyboard); // 输出帮助信息 printHelp(); glutMainLoop(); return 0; } ```
qt通过显示ffmpeg解码出的图像
已经实现ffmpeg解码http视频流为一帧一帧是图像。 想通过OpenGL 或者 QML 或者 还有其他什么办法可以把这些帧图像显示出(视频帧率:30fps,大小:1280x720)
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私...
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小人工智障。 思路可以运用在不同地方,主要介绍的是思路。
面试官问我:什么是消息队列?什么场景需要他?用了会出现什么问题?
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图、个人联系方式和人才交流群,欢迎Star和完善 前言 消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸...
8年经验面试官详解 Java 面试秘诀
作者 |胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。 Java程序员准备和投递简历的实...
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观...
MyBatis研习录(01)——MyBatis概述与入门
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis原本是apache的一个开源项目iBatis, 2010年该项目由apache software foundation 迁移到了google code并改名为MyBatis 。2013年11月MyBatis又迁移到Github。
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外...
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip installselenium -ihttps://pypi.tuna.tsinghua.edu.cn/simple/ ...
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca...
Python爬虫精简步骤1 获取数据
爬虫,从本质上来说,就是利用程序在网上拿到对我们有价值的数据。 爬虫能做很多事,能做商业分析,也能做生活助手,比如:分析北京近两年二手房成交均价是多少?广州的Python工程师平均薪资是多少?北京哪家餐厅粤菜最好吃?等等。 这是个人利用爬虫所做到的事情,而公司,同样可以利用爬虫来实现巨大的商业价值。比如你所熟悉的搜索引擎——百度和谷歌,它们的核心技术之一也是爬虫,而且是超级爬虫。 从搜索巨头到人工...
Python绘图,圣诞树,花,爱心 | Turtle篇
每周每日,分享Python实战代码,入门资料,进阶资料,基础语法,爬虫,数据分析,web网站,机器学习,深度学习等等。 公众号回复【进群】沟通交流吧,QQ扫码进群学习吧 微信群 QQ群 1.画圣诞树 import turtle screen = turtle.Screen() screen.setup(800,600) circle = turtle.Turtle()...
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东...
破14亿,Python分析我国存在哪些人口危机!
一、背景 二、爬取数据 三、数据分析 1、总人口 2、男女人口比例 3、人口城镇化 4、人口增长率 5、人口老化(抚养比) 6、各省人口 7、世界人口 四、遇到的问题 遇到的问题 1、数据分页,需要获取从1949-2018年数据,观察到有近20年参数:LAST20,由此推测获取近70年的参数可设置为:LAST70 2、2019年数据没有放上去,可以手动添加上去 3、将数据进行 行列转换 4、列名...
web前端javascript+jquery知识点总结
1.Javascript 语法.用途 javascript 在前端网页中占有非常重要的地位,可以用于验证表单,制作特效等功能,它是一种描述语言,也是一种基于对象(Object)和事件驱动并具有安全性的脚本语言 ...
Python实战:抓肺炎疫情实时数据,画2019-nCoV疫情地图
今天,群里白垩老师问如何用python画武汉肺炎疫情地图。白垩老师是研究海洋生态与地球生物的学者,国家重点实验室成员,于不惑之年学习python,实为我等学习楷模。先前我并没有关注武汉肺炎的具体数据,也没有画过类似的数据分布图。于是就拿了两个小时,专门研究了一下,遂成此文。
听说想当黑客的都玩过这个Monyer游戏(1~14攻略)
第零关 进入传送门开始第0关(游戏链接) 请点击链接进入第1关: 连接在左边→ ←连接在右边 看不到啊。。。。(只能看到一堆大佬做完的留名,也能看到菜鸡的我,在后面~~) 直接fn+f12吧 &lt;span&gt;连接在左边→&lt;/span&gt; &lt;a href="first.php"&gt;&lt;/a&gt; &lt;span&gt;←连接在右边&lt;/span&gt; o...
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ...... ...
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!...
渗透测试-灰鸽子远控木马
木马概述 灰鸽子( Huigezi),原本该软件适用于公司和家庭管理,其功能十分强大,不但能监视摄像头、键盘记录、监控桌面、文件操作等。还提供了黑客专用功能,如:伪装系统图标、随意更换启动项名称和表述、随意更换端口、运行后自删除、毫无提示安装等,并采用反弹链接这种缺陷设计,使得使用者拥有最高权限,一经破解即无法控制。最终导致被黑客恶意使用。原作者的灰鸽子被定义为是一款集多种控制方式于一体的木马程序...
Python:爬取疫情每日数据
前言 目前每天各大平台,如腾讯、今日头条都会更新疫情每日数据,他们的数据源都是一样的,主要都是通过各地的卫健委官网通报。 以全国、湖北和上海为例,分别为以下三个网站: 国家卫健委官网:http://www.nhc.gov.cn/xcs/yqtb/list_gzbd.shtml 湖北卫健委官网:http://wjw.hubei.gov.cn/bmdt/ztzl/fkxxgzbdgrfyyq/xxfb...
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。 再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。 下文是原回答,希望能对你能有所启发。 如果我说,这个世界上人真的分三六九等,...
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合...
雷火神山直播超两亿,Web播放器事件监听是怎么实现的?
Web播放器解决了在手机浏览器和PC浏览器上播放音视频数据的问题,让视音频内容可以不依赖用户安装App,就能进行播放以及在社交平台进行传播。在视频业务大数据平台中,播放数据的统计分析非常重要,所以Web播放器在使用过程中,需要对其内部的数据进行收集并上报至服务端,此时,就需要对发生在其内部的一些播放行为进行事件监听。 那么Web播放器事件监听是怎么实现的呢? 01 监听事件明细表 名...
3万字总结,Mysql优化之精髓
本文知识点较多,篇幅较长,请耐心学习 MySQL已经成为时下关系型数据库产品的中坚力量,备受互联网大厂的青睐,出门面试想进BAT,想拿高工资,不会点MySQL优化知识,拿offer的成功率会大大下降。 为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢 数据是存放在磁盘上的,读写速度无法和内存相比 如何优化 设计...
Python新型冠状病毒疫情数据自动爬取+统计+发送报告+数据屏幕(三)发送篇
今天介绍的项目是使用 Itchat 发送统计报告 项目功能设计: 定时爬取疫情数据存入Mysql 进行数据分析制作疫情报告 使用itchat给亲人朋友发送分析报告 基于Django做数据屏幕 使用Tableau做数据分析 来看看最终效果 目前已经完成,预计2月12日前更新 使用 itchat 发送数据统计报告 itchat 是一个基于 web微信的一个框架,但微信官方并不允许使用这...
作为程序员的我,大学四年一直自学,全靠这些实用工具和学习网站!
我本人因为高中沉迷于爱情,导致学业荒废,后来高考,毫无疑问进入了一所普普通通的大学,实在惭愧???? 我又是那么好强,现在学历不行,没办法改变的事情了,所以,进入大学开始,我就下定决心,一定要让自己掌握更多的技能,尤其选择了计算机这个行业,一定要多学习技术。 在进入大学学习不久后,我就认清了一个现实:我这个大学的整体教学质量和学习风气,真的一言难尽,懂的人自然知道怎么回事? 怎么办?我该如何更好的提升自...
粒子群算法求解物流配送路线问题(python)
1.Matlab实现粒子群算法的程序代码:https://www.cnblogs.com/kexinxin/p/9858664.html matlab代码求解函数最优值:https://blog.csdn.net/zyqblog/article/details/80829043 讲解通俗易懂,有数学实例的博文:https://blog.csdn.net/daaikuaichuan/article/...
教你如何编写第一个简单的爬虫
很多人知道爬虫,也很想利用爬虫去爬取自己想要的数据,那么爬虫到底怎么用呢?今天就教大家编写一个简单的爬虫。 下面以爬取笔者的个人博客网站为例获取第一篇文章的标题名称,教大家学会一个简单的爬虫。 第一步:获取页面 #!/usr/bin/python # coding: utf-8 import requests #引入包requests link = "http://www.santostang....
前端JS初级面试题二 (。•ˇ‸ˇ•。)老铁们!快来瞧瞧自己都会了么
1. 传统事件绑定和符合W3C标准的事件绑定有什么区别? 传统事件绑定 &lt;div onclick=""&gt;123&lt;/div&gt; div1.onclick = function(){}; &lt;button onmouseover=""&gt;&lt;/button&gt; 注意: 如果给同一个元素绑定了两次或多次相同类型的事件,那么后面的绑定会覆盖前面的绑定 (不支持DOM事...
相关热词 c# 压缩图片好麻烦 c#计算数组中的平均值 c#获取路由参数 c#日期精确到分钟 c#自定义异常必须继承 c#查表并返回值 c# 动态 表达式树 c# 监控方法耗时 c# listbox c#chart显示滚动条
立即提问